SQL 服务器:尝试使用变量语句查询时出现 EXECUTE 错误

SQL Server : EXECUTE error when trying to query with variable statements

任务是滚动所有 table 和列以找到包含搜索值的 table 和列名称。我使用的脚本是:

IF Object_id('tempdb..#temp_sar') IS NOT NULL 
  DROP TABLE #temp_sar 
go 

CREATE TABLE #temp_table 
( 
     [table_name]  VARCHAR, 
     [column_name] VARCHAR 
) 

DECLARE @Table_Name VARCHAR 
DECLARE @Column_Name VARCHAR 
DECLARE @Search_Value UNIQUEIDENTIFIER = CONVERT(UNIQUEIDENTIFIER, '303D9191-E201-4299-809E-FC7B0213F73C') 

DECLARE @CURSOR CURSOR 

SET @CURSOR = CURSOR scroll  FOR 
     (SELECT s.table_name, 
            s.column_name 
      FROM information_schema.columns s 
      WHERE s.data_type = 'uniqueidentifier') 

OPEN @CURSOR 

FETCH next FROM @CURSOR INTO @Table_Name, @Column_Name 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    IF @Search_Value = EXEC ('select distinct' + @Column_Name + 'from' 
                             + @Table_Name + 'where' + @Column_Name + '=' 
                              + @Search_Value) 
        INSERT INTO #temp_table ([table_name], [column_name]) 
        VALUES (@Table_Name, @Column_Name) 

    FETCH next FROM @CURSOR INTO @Table_Name, @Column_Name 
END 

CLOSE @CURSOR 

SELECT * FROM #temp_table; 

执行时出现错误:

Incorrect syntax near the keyword 'EXEC'

请帮助我使此代码正常工作

这条线有一些问题...

  IF @Search_Value = Exec('select distinct' + @Column_Name + 'from' 
                          + @Table_Name + 'where' + @Column_Name + '=' 
                          + @Search_Value)


首先,确保 sql 字符串中的必要位置有空格...

Exec('select distinct ' + @Column_Name + ' from ' 
                        + @Table_Name + ' where ' + @Column_Name + ' = ' 
                        + @Search_Value
)


接下来,如果执行 SELECT 语句,结果是数据集,而不是标量。这也意味着数据集也不会像函数一样返回 returns 标量结果。

可以使用 EXEC @myReturn = spSomethingOrAnother(@param, @anotherParam); 捕获通过 RETURN 语句发回的任何内容 (在 SP 的末尾),但我不'认为这适用于 Dynamic SQL...

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/execute-transact-sql


您的下一个选择可能是创建一个 table 以将结果插入其中,然后检查 table...

INSERT INTO @TABLE EXEC @query with SQL Server 2000

CREATE TABLE #result (search_value UNIQUEIDENTIFIER)

INSERT INTO 
  #result (
    search_value
  )
EXEC(
  'select distinct ' + @Column_Name + ' from ' 
                     + @Table_Name + ' where ' + @Column_Name + ' = ' 
                     + @Search_Value
)

IF EXISTS (SELECT * FROM #result WHERE search_value = @search_value)

...
{USE PROD
GO
IF OBJECT_ID('tempdb..#source_table') IS NOT NULL DROP TABLE #source_table 
GO
IF OBJECT_ID('tempdb..#result_table') IS NOT NULL DROP TABLE #result_table 
GO
CREATE TABLE #result_table (Table_Name nvarchar(max),Column_Name nvarchar(max),Searched_Value uniqueidentifier)
DECLARE @CURSOR             CURSOR
DECLARE @Table_Name         nvarchar(max)
DECLARE @Column_Name        nvarchar(max)
DECLARE @Search_Value       nvarchar(max) = concat('''','ABBDFFEA-4576-4AA9-854E-A016433C54F0','''')
SET @CURSOR  = CURSOR SCROLL
    FOR
    (
        select s.TABLE_NAME, s.COLUMN_NAME 
        from INFORMATION_SCHEMA.COLUMNS s
        where s.DATA_TYPE = 'uniqueidentifier'
    )
OPEN @CURSOR
FETCH NEXT FROM @CURSOR INTO @Table_Name, @Column_Name
WHILE @@FETCH_STATUS = 0  
BEGIN
INSERT INTO #result_table (Table_Name, Column_Name, Searched_Value) EXEC('select distinct ' + ''''+ @Table_Name + '''' + ' AS Table_Name , ' + ''''+ @Column_Name + '''' + ' AS Column_Name , ' + '[' + @Column_Name + ']' + ' from ' + '[' + @Table_Name + ']' + ' where ' + '[' + @Column_Name + ']' + ' = ' + @Search_Value)
FETCH NEXT FROM @CURSOR INTO @Table_Name, @Column_Name
END
CLOSE @CURSOR
--results
SELECT * FROM #result_table}