我在这里有一个查询,在整个数据库中搜索我选择的特定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
我可能会对临时表的工作方式有误,但我看不到使用此代码的表输出。
答案 0 :(得分: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
答案 1 :(得分:0)
在使用EXEC时,您正在生成另一个进程,因此您的临时表将被删除并在每次传递时重新创建。尝试使用相同的代码,但使用全局临时表(##temporary
)。
另外我假设SELECT @ FROM #temporary
是一个拼写错误,你实际上是SELECT * FROM #temporary
。