1

カーソルからテーブル名を読み取る 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
4

1 に答える 1

2

私の知る限り、変数をテーブル名として使用できないため、句dbo.@syn_nameでは機能しません。FROM代わりに、動的 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
于 2012-12-17T21:12:46.507 に答える