можно обрезать несколько таблиц с помощью курсора на сервере SQL - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь это, но не работает

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

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

В приведенном ниже примере используется каталогное представление 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 Serveer 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 для обработки случаев, когда имя не соответствует правилам именования обычных идентификаторов.

0 голосов
/ 30 августа 2018

Нельзя передавать идентификаторы (такие как имена таблиц, имена столбцов и т. Д.) В качестве параметров в запросах. Вместо этого вам нужно использовать динамический SQL.

Замените внутренний цикл на:

declare @sql nvarchar(max);

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

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

exec sp_executesql @sql;
...