2013-04-10 13 views

Odpowiedz

6

Nie można obciąć tylko pojedynczą tabelę z poleceniem TRUNCATE. Aby skrócić wiele tabel, możesz użyć T-SQL i iterować po nazwach tabel, aby skracać każdą z nich naraz.

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 

Można mieć wszystkie swoje oddzielone przecinkami nazwy tabel w zmiennej @tableList i tak można obciąć wiele tabel z różnych schematów, jeśli są prefiksem.

+0

um ... Czy to rzeczywiście praca? –

9

można użyć sp_MSforeachtable procedurę przechowywaną tak:

USE MyDatabase 
EXEC sp_MSforeachtable 'TRUNCATE TABLE ?' 

Albo można CREATE SQL

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

i uruchomić Powyższa instrukcja SQL

+0

doskonały, właśnie tego szukałem - dzięki! – maialithar

+0

doskonały. Użyłem tego w SSIS przy użyciu exec sql, aby uzyskać listę i pętlę foreach do iteracji po każdej z nich. Sądzę, że możesz zrobić to samo w SSMS z kursorem. – KeithL

6

nr Ale istnieje alternatywa :

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

Przykład:

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

Teraz masz poniżej wyników dla powyższego Select Query

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

lub użyć coś takiego

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

Link 1

Link 2

Aktualizacja:

Patrząc na stole w swoim przykładzie Query w swoim pytaniu

truncate table #OBJ_AvailabilityTraining, #OBJ_AvailabilityHoliday, #Dates_temp

myślę chcesz Truncate wszystkim tymczasowe tabele.

Można to zrobić za pomocą prostego Query jak ten

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

przykład Bonus, obciąć wszystkich tabel w jednej bazie danych zaczynające się ciągiem ...

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