我正在使用T-SQL获取一些满足特定条件的表名 - 将这些表的名称放在临时表中@MyTempTable
并计划从所有具有条目的表中删除所有行@MyTempTable
。
我注意到我的@MyTempTable
已正确填充了必须删除的相关表的名称,但当我尝试在DELETE
中的每个条目上执行@MyTempTable
命令时,它会抛出一个语法错误,说"Must declare a table variable "@localVar
“。我想这是因为它不允许我使用每一行的值作为表的名称来删除条目。你能建议我如何解决这个问题吗?
/* Define temporary table */
DECLARE @MyTmpTable TABLE ( my_row varchar(20));
/* local variable holds the name of the table that has to be deleted based on the query below */
DECLARE @localVar varchar(20);
/* Declare curser */
DECLARE c5 CURSOR FOR (
/* SELECT TOP 10 vc_merchant_name FROM dbo.merchant_versioned */
select
t.name
from
sys.tables t
where
exists (
select null from sys.columns c
where c.object_id = t.object_id and c.name = 'i_version_id')
);
OPEN c5;
FETCH NEXT FROM c5 INTO @localVar;
WHILE @@FETCH_STATUS = 0
BEGIN
/*************************************************/
DELETE FROM @localVar; /* <<<--- THIS DOESN"T WORK
/*************************************************/
FETCH NEXT FROM c5 INTO @localVar;
END
CLOSE c5;
DEALLOCATE c5;
答案 0 :(得分:2)
您收到该错误是因为您确实在尝试执行
DELETE FROM @localVar
这不只是像你想要的那样插入那个参数的值。 您需要使用动态SQL来完成此任务,然后如Rob所说,使用SP_EXECUTE。
DECLARE @localVar varchar(20);
DECLARE @qString varchar(max)
....
BEGIN
set qString = 'DELETE FROM ' + @localVar
SP_EXECUTE(qString)
END
...