いくつかのデータをクレンジングする必要があり、SQLServer°で特定のガイド(つまり、 uniqueidentifiers)を見つける必要があります。
現在のデータベースのすべてのテーブルのすべてのuniqueidentifier列からSELECTを実行し、GUIDが見つかった場合に結果セットを返すストアドプロシージャを考え出しました。
これは、INFORMATION_SCHEMAビューを使用して、 (ビューではなく)すべてのベーステーブル内のすべてのuniqueidentifier列を検索します。列ごとにselectを発行し、テーブルの名前とそれが見つかった列を返します。
CREATE PROCEDURE dbo.FindGUID @searchValue uniqueidentifier AS
/*
Search all tables in the database for a guid
6/9/2009: Removed the IF EXISTS to double hit the database
*/
--DECLARE @searchValue uniqueidentifier
--SET @searchValue = '{2A6814B9-8261-452D-A144-13264433864E}'
DECLARE abc CURSOR FOR
SELECT
c.TABLE_NAME, c.COLUMN_NAME
FROM INFORMATION_SCHEMA.Columns c
INNER JOIN INFORMATION_SCHEMA.Tables t
ON c.TABLE_NAME = t.TABLE_NAME
AND t.TABLE_TYPE = 'BASE TABLE'
WHERE DATA_TYPE = 'uniqueidentifier'
DECLARE @tableName varchar(200)
DECLARE @columnName varchar(200)
DECLARE @szQuery varchar(8000)
OPEN ABC
FETCH NEXT FROM abc INTO @tableName, @columnName
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @szQuery =
'SELECT '''+@tableName+''' AS TheTable, '''+@columnName+''' AS TheColumn '+
'FROM '+@tableName+' '+
'WHERE '+@columnName+' = '''+CAST(@searchValue AS varchar(50))+''''
PRINT 'Searching '+@tableName+'.'+@columnName+'..'
PRINT @szQuery
EXEC (@szQuery)
FETCH NEXT FROM abc INTO @tableName, @columnName
END
CLOSE abc
DEALLOCATE abc
私の質問は:
質問1
個別のクエリではなく、ORと同じテーブル内の複数のuniqueidentifier列の検索を実行するように変更する方法を誰かが理解できますか?
すなわち
SELECT ... FROM Prices WHERE BookGUID = '{...}'
SELECT ... FROM Prices WHERE AuthorGUID = '{...}'
SELECT ... FROM Prices WHERE PublisherGUID = '{...}'
SELECT ... FROM Prices WHERE StoreGUID = '{...}'
次のようになります:
SELECT ...
FROM Prices
WHERE BookGUID = '{...}'
OR AuthorGUID = '{...}'
OR PublisherGUID = '{...}'
OR StoreGUID = '{...}'
カーソル内でカーソルを使用しようとしましたが、FETCH_STATUSの競合が発生します。
質問2 誰かがそれを行うためのより良い方法を考えることができますか?‡</ p>
脚注:
°SQLServer2000
‡リレーショナルデータベースでuniqueidentifiersを使用するという制約があります。