Tsql T-SQL在WITH语句中动态传递表名
我在T-SQL中有以下代码,可以从游标读取表名 但是我对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
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