Tsql T-SQL在WITH语句中动态传递表名

Tsql T-SQL在WITH语句中动态传递表名,tsql,cursor,with-statement,Tsql,Cursor,With Statement,我在T-SQL中有以下代码,可以从游标读取表名 但是我对with语句中的作用域表名称变量有问题 当我显式地将dbo.@sys\u name设置为类似dbo.mysysnonym的同义词名称时,我可以运行此代码,但当我将其作为变量名称设置为类似dbo.@syn\u name时,它不起作用 -- drop duplicates records from synonyms DECLARE @syn_name varchar(50) DECLARE s_cursor CURSOR FOR

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

但是我对
with
语句中的作用域表名称变量有问题

当我显式地将
dbo.@sys\u name
设置为类似
dbo.mysysnonym
的同义词名称时,我可以运行此代码,但当我将其作为变量名称设置为类似
dbo.@syn\u 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

据我所知,您不能使用变量作为表名,因此
dbo.@syn_name
FROM
子句中不起作用。相反,您将不得不使用

比如:

...
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