可以在sql server中使用Cursor截断多个表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可以在sql server中使用Cursor截断多个表相关的知识,希望对你有一定的参考价值。
我尝试这个但是没有用
ALTER Procedure [dbo].[SP_TruncateDTS] as
begin
declare @Table Varchar(200)
declare cur1 cursor for
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME like '%DTS%' and TABLE_TYPE = 'BASE TABLE'
open cur1
fetch next from cur1 into @Table
while @@FETCH_STATUS <> -1
begin
TRUNCATE TABLE @Table
fetch next from cur1 into @Table
end
close cur1
deallocate cur1
end
答案
您不能将标识符(例如表名,列名等)作为参数传递给查询。相反,您需要使用动态SQL。
所以用以下内容替换内部循环:
declare @sql nvarchar(max);
set @sql = 'TRUNCATE TABLE [Table]';
set @sql = replace(@sql, '[Table]', @table);
exec sp_executesql @sql;
另一答案
下面的示例使用sys.tables
目录视图和聚合字符串连接而不是任务的游标。
DECLARE @SQL nvarchar(MAX) = (
SELECT N'TRUNCATE TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + N'.' + QUOTENAME(name) +N';'
FROM sys.tables
WHERE name like N'%DTS%'
FOR XML PATH(''), TYPE).value('.', 'nvarchar(MAX)');
EXECUTE sp_executesql @SQL;
在SQL Server 2017及更高版本中,您可以使用qazxsw poi:
STRING_AGG
请注意,此模式限定名称并使用DECLARE @SQL nvarchar(MAX) = (
SELECT STRING_AGG ('TRUNCATE TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + N'.' + QUOTENAME(name),';')
FROM sys.tables
WHERE name like N'%DTS%'
);
EXECUTE sp_executesql @SQL;
来处理名称不符合常规标识符命名规则的情况。
以上是关于可以在sql server中使用Cursor截断多个表的主要内容,如果未能解决你的问题,请参考以下文章
从 Excel 导入 SQL Server 2005 时出现截断错误
用户将在 SQL Server 中截断字符串或二进制数据