ここに、選択した特定のGUIDをデータベース全体で検索するためのクエリがあります。現在、プログラムされているとおりに実行されています。すべての列/テーブルコンボを循環し、情報が含まれる場合と含まれない場合があるテーブルを出力します。これを変更して、結果を含むテーブルのみを出力するようにします。
コードは次のとおりです。
DECLARE
@tab_list NVARCHAR(MAX),
@col_list NVARCHAR(MAX),
@IDquery NVARCHAR(MAX),
@srvName NVARCHAR(MAX),
@getList CURSOR
SET @srvName = 'Server_Name'
SET @getList = CURSOR LOCAL FAST_FORWARD FOR
SELECT [TABLE_NAME]
,[COLUMN_NAME]
FROM [Server_Name].[INFORMATION_SCHEMA].[COLUMNS]
WHERE [COLUMN_NAME] LIKE '%id'
AND [DATA_TYPE] LIKE 'uniqueidentifier'
ORDER BY [TABLE_NAME] ASC
OPEN @getList
FETCH NEXT FROM @getList INTO @tab_list, @col_list
WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT @tab_list + ' -- ' + @col_list
SET @IDquery =
'SELECT *' +
' FROM ' + @srvName + '.dbo.' + @tab_list +
' WHERE ' + @col_list + ' = (''GUID_HERE'')' +
' AND ' + @col_list + ' IS NOT NULL'
--PRINT @IDquery
EXEC (@IDquery)
FETCH NEXT FROM @getList INTO @tab_list, @col_list
END
CLOSE @getList
DEALLOCATE @getList
それは今のところ仕事ですが、ひどく非効率的です。前に述べたように、このGUIDを検索すると、一致するテーブルがない場合でも、検索したすべてのテーブルが出力されます。一致するテーブルのみを出力したいのですが、方法は関係ありません。正直なところ、返されるのが一致するテーブルと列だけであるかどうかは気にしません(つまり、手動でそのテーブルをヒットする必要があります)。よりクリーンな出力が欲しいだけで、答えをまとめることができないようです。
編集:だから私は一時的なテーブルが提供する約束が好きですが、私は少し問題にぶつかっています。これが私が持っているものです:
WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT @tab_list + ' -- ' + @col_list
SET @IDquery =
'SELECT * INTO #temporary' +
' FROM ' + @srvName + '.dbo.' + @tab_list +
' WHERE ' + @col_list + ' = (''GUID_HERE'')' +
' AND ' + @col_list + ' IS NOT NULL'
--PRINT @IDquery
EXEC (@IDquery)
FETCH NEXT FROM @getList INTO @tab_list, @col_list
END
IF (@@ROWCOUNT > 0)
SELECT @ FROM #temporary
DROP DATABASE #temporary
CLOSE @getList
DEALLOCATE @getList
一時テーブルの動作を誤解している可能性がありますが、このコードではテーブル出力が表示されません。