2013-04-10 3 views

ответ

6

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

+0

гм ... делает это на самом деле Работа? –

9

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

USE MyDatabase 
EXEC sp_MSforeachtable 'TRUNCATE TABLE ?' 

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

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

и запустить его выше SQL Statement

+0

отлично, только то, что я искал - спасибо! – maialithar

+0

безупречный. Я использовал это в SSIS, используя exec sql, чтобы получить список и цикл foreach для повторения каждого из них. Я думаю, вы могли бы сделать то же самое в SSMS с помощью курсора. – KeithL

6

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

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 Query

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') 

Link 1

Link 2

Update:

Глядя на таблицу в вашем примере Query в вашем вопросе

truncate table #OBJ_AvailabilityTraining, #OBJ_AvailabilityHoliday, #Dates_temp

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

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

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

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

SELECT CONCAT('TRUNCATE TABLE ', TABLE_NAME, ';') 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'my_database_name' 
    AND TABLE_NAME LIKE 'cache_%'; 
Смежные вопросы