Подтвердить что ты не робот

Усечение нескольких таблиц в одном выражении MySQL

Есть ли возможность обрезать один оператор SQL, несколько таблиц?

Вот так:

 truncate table #OBJ_AvailabilityTraining, #OBJ_AvailabilityHoliday, #Dates_temp;

Привет

4b9b3361

Ответ 1

Нет, вы можете обрезать только одну таблицу командой TRUNCATE. Чтобы усечь несколько таблиц, вы можете использовать T-SQL и итерации по именам таблиц, чтобы обрезать каждую за раз.

DECLARE @delimiter CHAR(1),
        @tableList VARCHAR(MAX),
        @tableName VARCHAR(20),
        @currLen INT

SET @delimiter = ','

SET @tableList = 'table1,table2,table3'

WHILE LEN(@tableList) > 0
BEGIN
    SELECT @currLen = 
    (
        CASE charindex( @delimiter, @tableList ) 
            WHEN 0 THEN len( @tableList  ) 
            ELSE ( charindex( @delimiter, @tableList  ) -1 )
        END
    ) 

    SELECT @tableName = SUBSTRING (@tableList,1,@currLen )

    TRUNCATE TABLE @tableName

    SELECT tableList = 
    (
        CASE ( len( @tableList ) - @currLen  ) 
            WHEN 0 THEN '' 
            ELSE right( @tableList, len( @tableList ) - @currLen  - 1 ) 
        END
    ) 
END

Все имена таблиц могут быть разделены запятыми в переменной @tableList и да, вы можете обрезать несколько таблиц из разных схем, если они имеют префикс.

Ответ 2

Вы можете использовать хранимую процедуру sp_MSforeachtable следующим образом:

USE MyDatabase
EXEC sp_MSforeachtable 'TRUNCATE TABLE ?'

Или вы можете создать SQL Statement

SELECT concat('TRUNCATE TABLE ', TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'TableName%'

и запустите этот оператор SQL

Ответ 3

Нет. Но есть альтернатива:

SELECT 'TRUNCATE TABLE '+TABLE_NAME+ ';'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'your-table-name%'

Пример:

SELECT 'TRUNCATE TABLE '+TABLE_NAME+ ';'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'TBL_ORDERS_20%'

Теперь у вас есть ниже результатов выше Select Запрос

TRUNCATE TABLE TBL_ORDERS_2001
TRUNCATE TABLE TBL_ORDERS_2002
TRUNCATE TABLE TBL_ORDERS_2003
TRUNCATE TABLE TBL_ORDERS_2004

или вы можете использовать что-то вроде

select 'Truncate table ' + TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME in ('Table1', 'Table2')

Ссылка 1

Ссылка 2

Update:

Посмотрите на таблицу в своем примере Query в своем вопросе

truncate table #OBJ_AvailabilityTraining, #OBJ_AvailabilityHoliday, #Dates_temp

Я думаю, вы хотите Truncate все временные таблицы.

Вы можете сделать это с помощью простого Query, подобного этому

select 'Truncate table ' + TABLE_NAME from tempdb.INFORMATION_SCHEMA.TABLES

Ответ 4

Пример бонуса, обрезайте все таблицы в одной базе данных, начиная со строки...

SELECT CONCAT('TRUNCATE TABLE ', TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'my_database_name'
  AND TABLE_NAME LIKE 'cache_%';

Ответ 5

Просто введите этот оператор MySQL:

TRUNCATE TABLE yourtablename1;
TRUNCATE TABLE yourtablename2;
TRUNCATE TABLE yourtablename3;

... и так далее.

Измените yourtablameame на свой.

Не забывайте точку с запятой;

Ответ 6

Мне пришлось изменить код, посланный IndoKnight, потому что он выдает мне ошибку в инструкции truncate, поэтому я меняю код на это, это очень похоже, но часть truncate:

DECLARE @delimiter CHAR(1),
        @tableList VARCHAR(MAX),
        @tableName VARCHAR(100),
        @currLen INT,
        @truncateStatement VARCHAR(200)

SET @delimiter = ','

SELECT @tableList = COALESCE(@tableList + ', ','') + CAST (TABLE_NAME AS varchar(100))
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA = 'xxx'

    WHILE LEN(@tableList) > 0
    BEGIN
        SELECT @currLen = 
        (
            CASE charindex( @delimiter, @tableList ) 
                WHEN 0 THEN len( @tableList  ) 
                ELSE ( charindex( @delimiter, @tableList  ) -1 )
            END
        ) 

        SELECT @tableName = TRIM(SUBSTRING (@tableList,1,@currLen ))

        SET @truncateStatement = 'TRUNCATE TABLE ' + QUOTENAME('xxx') + '.' + QUOTENAME(@tableName)
        EXEC (@truncateStatement)

        SELECT @tableList = 
        (
            CASE ( len( @tableList ) - @currLen  ) 
                WHEN 0 THEN '' 
                ELSE right( @tableList, len( @tableList ) - @currLen  - 1 ) 
            END
        ) 
    END

Трюк использует QUOTENAME, чтобы поместить квадратные скобки в имя таблицы и схему. Возможно, решение IndoKnight больше не работает в более поздней версии базы данных. Я надеюсь, что это помогает.