Transact sql:必须声明标量变量

时间:2017-04-27 12:53:35

标签: sql-server tsql

我正在尝试迭代某些表并清除所有记录。

我的代码如下:

DECLARE @table varchar(100)
DECLARE db_cursor CURSOR FOR select name from sys.tables where name like '%cfe_%'
OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @table

WHILE @@FETCH_STATUS = 0   
BEGIN   
       print @table        
	   delete from @table
       FETCH NEXT FROM db_cursor INTO @table   
END   

CLOSE db_cursor   
DEALLOCATE db_cursor

但是我在“删除...”

行收到“必须声明表变量”@table“

我看不出错误。

谢谢

5 个答案:

答案 0 :(得分:1)

你应该使用动态查询,

DECLARE @table varchar(100)
        ,@v_str nvarchar(200)
DECLARE db_cursor CURSOR FOR select name from sys.tables where name like '%cfe_%'
OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @table

WHILE @@FETCH_STATUS = 0   
BEGIN   
       print @table   

       set   @v_str = 'delete from '+@table   

       exec(@v_str)

       FETCH NEXT FROM db_cursor INTO @table   
END   

CLOSE db_cursor   
DEALLOCATE db_cursor

答案 1 :(得分:1)

您需要动态删除声明...试试这个:

DECLARE @cmd VARCHAR(4000)
DECLARE @table varchar(100)
DECLARE db_cursor CURSOR FOR select name from sys.tables where name like '%cfe_%'
OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @table

WHILE @@FETCH_STATUS = 0   
BEGIN   
       SET @cmd = 'DELETE FROM '+@table       
       EXEC (@cmd)
       FETCH NEXT FROM db_cursor INTO @table   
END   

CLOSE db_cursor   
DEALLOCATE db_cursor

答案 2 :(得分:1)

更好的方法是不在这里使用光标。在sql中循环是最后的手段。此外,您的查询不会完全按照您的想法执行,因为您使用的是并且想要查找下划线。 LIKE谓词中的下划线要求使用方括号进行转义。发布后,您的查询将返回名称中没有cfe _的任何表格。

如果您觉得动态sql字符串是您想要的,您可以取消注释以执行它。

declare @SQL nvarchar(max) = ''

select @SQL = @SQL + 'delete from ' + name + ';'
from sys.tables
where name like '%cfe[_]%'

select @SQL
--exec sp_executesql @SQL

答案 3 :(得分:0)

我们也可以使用while循环来完成这个过程

DECLARE @Min Int,@max Int
IF Object_id('Tempdb..#DeleteList')IS NOT NULL
DROP TABLE #DeleteList

CREATE TABLE #DeleteList (Id Int Identity,Name varchar(100))

INSERT INTO #DeleteList(Name)
SELECT name FROM sys.tables WHERE CHARINDEX('cfe_',name)>0
SELECT @Min=Min(Id) FROm #DeleteList
SELECT @max=MAX(Id) FROm #DeleteList

While(@Min<=@max)
Begin
Declare @TableName Varchar(50),
        @Sql Nvarchar(max)
SELECT @TableName=Name From #DeleteList Where id=@Min

SET @Sql='DELETE From '+@TableName
Exec (@Sql)
SET @Min=@Min+1
END

但是如果删除表有外键引用,则会抛出错误,因此首先需要从子目录中删除记录,然后转到父表

答案 4 :(得分:-1)

您需要做类似的事情;

EXEC sp_executesql @statement = N'DELETE FROM ' + @table

因为目前您正在尝试从String变量中删除,而不是与变量

相同的表