sql - 禁止基于 WHERE 子句的 SELECT 输出

标签 sql sql-server t-sql cursor guid

我在这里有一个查询,用于在整个数据库中搜索我选择的特定 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 时,它会输出它搜索的任何表,甚至是那些没有匹配项的表。我希望它只输出包含匹配项的表,我不在乎如何输出。老实说,我什至不关心它返回的是否只是一个在其中找到匹配项的表和列(这意味着我必须手动点击该表)。我只是想要更清晰的输出,但似乎无法将答案放在一起。

编辑:所以我喜欢临时表提供的 promise ,尽管我遇到了一些障碍。这是我所拥有的:

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

我可能对临时表的工作方式有误解,但我没有看到此代码的表输出。

最佳答案

不要直接从表中选择,而是将结果插入到临时表中。然后检查@@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

关于sql - 禁止基于 WHERE 子句的 SELECT 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14610828/

相关文章:

sql - Postgres 截断 CASE 语句列

sql - 创建默认为纪元时间的字段

sql - db2 特定于不同行数的查询

sql - 从动态行号创建动态列名称

sql - 如何执行存储在 varchar 变量中的数学表达式

python - ('IM004' , "[IM004] [Microsoft][ODBC Driver Manager] Driver' s SQL_HANDLE_ENV 上的 SQLAllocHandle 失败 (0) (SQLDriverConnect)") 错误

sql-server - 具有聚集 GUID PK 的 SQL Server 数据库 - 切换聚集索引还是切换到顺序(梳状)GUID?

c# - 更改从asp.net中的sql查询接收到的文本

t-sql - 为什么在完全隔离的情况下运行时 @@rowcount 等于 1?

SQL 从字符串中提取值