Есть ли возможность обрезать один оператор SQL, несколько таблиц?
Вот так:
truncate table #OBJ_AvailabilityTraining, #OBJ_AvailabilityHoliday, #Dates_temp;
Привет
Есть ли возможность обрезать один оператор SQL, несколько таблиц?
Вот так:
truncate table #OBJ_AvailabilityTraining, #OBJ_AvailabilityHoliday, #Dates_temp;
Привет
Нет, вы можете обрезать только одну таблицу командой 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 и да, вы можете обрезать несколько таблиц из разных схем, если они имеют префикс.
Вы можете использовать хранимую процедуру 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
Нет. Но есть альтернатива:
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')
Update:
Посмотрите на таблицу в своем примере Query
в своем вопросе
truncate table #OBJ_AvailabilityTraining, #OBJ_AvailabilityHoliday, #Dates_temp
Я думаю, вы хотите Truncate
все временные таблицы.
Вы можете сделать это с помощью простого Query
, подобного этому
select 'Truncate table ' + TABLE_NAME from tempdb.INFORMATION_SCHEMA.TABLES
Пример бонуса, обрезайте все таблицы в одной базе данных, начиная со строки...
SELECT CONCAT('TRUNCATE TABLE ', TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'my_database_name'
AND TABLE_NAME LIKE 'cache_%';
Просто введите этот оператор MySQL:
TRUNCATE TABLE yourtablename1;
TRUNCATE TABLE yourtablename2;
TRUNCATE TABLE yourtablename3;
... и так далее.
Измените yourtablameame на свой.
Не забывайте точку с запятой;
Мне пришлось изменить код, посланный 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 больше не работает в более поздней версии базы данных. Я надеюсь, что это помогает.