【问题标题】:T-SQL passing a table name dynamically inside WITH statementT-SQL 在 WITH 语句中动态传递表名
【发布时间】:2012-12-17 21:05:59
【问题描述】:

我在 T-SQL 中有以下从游标读取表名的代码。

但我对WITH 语句中的范围表名称变量有疑问。

当我将dbo.@sys_name 显式设置为dbo.mysysnonym 之类的同义词名称时,我可以运行此代码,但是当我将其设置为dbo.@syn_name 之类的变量名称时,它不起作用。

 -- drop duplicates records from synonyms
 DECLARE @syn_name varchar(50)

 DECLARE s_cursor CURSOR FOR  
     SELECT name 
     FROM sys.synonyms  
     WHERE  base_object_name LIKE 'xyz%'

 OPEN s_cursor;

 FETCH NEXT FROM s_cursor INTO @syn_name;

 WHILE @@FETCH_STATUS = 0
 BEGIN

     FETCH NEXT FROM s_cursor INTO @syn_name;

     WITH  dedupTable AS 
     (
         SELECT 
             sys_id, 
             row_number() OVER (PARTITION BY sys_id ORDER BY sys_id) AS nr
         FROM 
             dbo.@syn_name
     )
     DELETE  FROM dedupTable
     WHERE nr > 1
END;

CLOSE s_cursor
DEALLOCATE s_cursor

【问题讨论】:

    标签: tsql cursor with-statement


    【解决方案1】:

    据我所知,您不能将变量用作表名,因此dbo.@syn_name 不能在FROM 子句中使用。相反,您必须使用Dynamic SQL

    类似:

    ...
    FETCH NEXT FROM s_cursor INTO @syn_name;
    DECLARE @sql nvarchar(4000)
    
    SET @sql = N'
        WITH  dedupTable
        AS ( 
           SELECT sys_id, row_number() 
           OVER ( PARTITION BY sys_id ORDER BY sys_id  ) AS nr
           FROM dbo.' + @syn_name + '
        )
        DELETE  FROM dedupTable
        WHERE   nr > 1'
    
    EXEC sp_executesql @sql
    

    【讨论】:

      猜你喜欢
      • 2016-04-25
      • 2016-04-20
      • 2023-03-05
      • 2021-04-01
      • 2020-11-04
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      相关资源
      最近更新 更多