1つのSQLステートメント、複数のテーブルで切り捨てられる可能性はありますか?
このような:
truncate table #OBJ_AvailabilityTraining, #OBJ_AvailabilityHoliday, #Dates_temp;
よろしく
いいえ、TRUNCATEコマンドを使用して1つのテーブルのみを切り捨てることができます。複数のテーブルを切り捨てるには、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ステートメントを作成できます
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
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')
更新:
質問の例Query
の表を見る
truncate table #OBJ_AvailabilityTraining, #OBJ_AvailabilityHoliday, #Dates_temp
Truncate
all一時テーブルにしたいと思います。
次のような単純なQuery
でこれを行うことができます
select 'Truncate table ' + TABLE_NAME from tempdb.INFORMATION_SCHEMA.TABLES
次のMySQLステートメントを簡単に入力します。
TRUNCATE TABLE yourtablename1;
TRUNCATE TABLE yourtablename2;
TRUNCATE TABLE yourtablename3;
... 等々。
yourtablenameをyoursで変更します。
セミコロンを忘れないでください。
ボーナスの例では、1つのデータベース内のすべてのテーブルを文字列で切り捨てます...
SELECT CONCAT('TRUNCATE TABLE ', TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'my_database_name'
AND TABLE_NAME LIKE 'cache_%';
IndoKnightによって送信されたコードを変更する必要がありました。これは、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ソリューションは、データベースの最新バージョンでは機能しなくなっている可能性があります。役に立てば幸いです。