我正在尝试迭代某些表并清除所有记录。
我的代码如下:
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“我看不出错误。
谢谢
答案 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变量中删除,而不是与变量
相同的表