行的T-SQL删除无效

时间:2013-11-19 23:53:04

标签: sql sql-server tsql relational-database dml

我正在使用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;

1 个答案:

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