【问题标题】:can truncate multiple tables Using Cursor in sql server可以在 sql server 中使用 Cursor 截断多个表
【发布时间】:2018-08-30 10:23:06
【问题描述】:

我试过了,但没用

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

【问题讨论】:

  • dbms 名称好吗?

标签: sql-server tsql cursor truncate


【解决方案1】:

您不能在查询中将标识符(例如表名、列名等)作为参数传递。相反,您需要使用动态 SQL。

所以将内部循环替换为:

declare @sql nvarchar(max);

set @sql = 'TRUNCATE TABLE [Table]';

set @sql = replace(@sql, '[Table]', @table);

exec sp_executesql @sql;

【讨论】:

  • 没有理由更换表。您可以将变量名称添加到您的字符串中
【解决方案2】:

下面的示例使用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 及更高版本中,您可以使用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;

请注意,此架构限定名称并使用 QUOTENAME 来处理名称不符合常规标识符命名规则的情况。

【讨论】:

    猜你喜欢
    • 2013-05-13
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多