2

ここに、選択した特定の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

一時テーブルの動作を誤解している可能性がありますが、このコードではテーブル出力が表示されません。

4

2 に答える 2

5

テーブルから直接選択する代わりに、結果を一時テーブルに挿入します。次に、をチェックして、@@ROWCOUNTによってレコードが見つかったかどうかを判断し、見つかったSELECT... INTO場合は、一時テーブルから結果を選択します。

SET @IDquery = '
    SELECT * INTO #Temp
    FROM ' + @srvName + '.dbo.' + @tab_list + ' 
    WHERE ' + @col_list + ' = (''GUID_HERE'')
    AND ' + @col_list + ' IS NOT NULL

    IF (@@ROWCOUNT > 0)
        SELECT * FROM #Temp
'

--PRINT @IDquery
EXEC (@IDquery)

FETCH NEXT FROM @getList INTO @tab_list, @col_list
于 2013-01-30T18:33:10.757 に答える
0

EXEC を使用しているときに別のプロセスを生成しているため、パスごとに一時テーブルが削除され、再作成されます。グローバル一時テーブル ( ##temporary) を使用して、同じコードを使用してみてください。

SELECT @ FROM #temporaryまた、タイプミスであり、実際に実行されたと想定していますSELECT * FROM #temporary

于 2013-01-30T23:53:24.360 に答える