Sql server Transact-sql:必须声明标量变量

Sql server Transact-sql:必须声明标量变量,sql-server,tsql,Sql Server,Tsql,我试图遍历一些表并清除所有记录 我的代码如下: 声明@table varchar100 为sys.tables中的select name声明db_游标,该sys.tables中的名称类似于“%cfe_%” 打开db_光标 从db_游标获取下一个到@table 而@@FETCH\u STATUS=0 开始 打印@表格 从@table中删除 从db_游标获取下一个到@table 结束 关闭db_光标 解除分配db_游标您将需要执行以下操作: EXEC sp_executesql @statemen

我试图遍历一些表并清除所有记录

我的代码如下:

声明@table varchar100 为sys.tables中的select name声明db_游标,该sys.tables中的名称类似于“%cfe_%” 打开db_光标 从db_游标获取下一个到@table 而@@FETCH\u STATUS=0 开始 打印@表格 从@table中删除 从db_游标获取下一个到@table 结束 关闭db_光标
解除分配db_游标您将需要执行以下操作:

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

因为当前您正在尝试从字符串变量中删除,而不是从与应使用动态查询的变量同名的表中删除

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

您需要动态删除语句。。。试试这个:

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

最好不要在这里使用光标。sql中的循环是最后的手段。此外,您的查询不会完全按照您认为的那样执行,因为您正在使用like并希望找到下划线。LIKE谓词中的下划线要求用方括号转义。正如所发布的,您的查询将返回名称为not cfe\的任何带有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
我们也可以在这个过程中使用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

但是,如果删除表有外键引用,它将抛出错误,因此首先需要从子表中删除记录,然后转到父表,因为不能从游标内的表变量中执行删除操作。用临时表代替。效果很好。谢谢,除非下划线用方括号括起来,否则这将返回任何带有字符cfe的表,它将忽略下划线,因为它被视为向后兼容的通配符。