web-dev-qa-db-ja.com

1つのMySQLステートメントで複数のテーブルを切り捨てる

1つのSQLステートメント、複数のテーブルで切り捨てられる可能性はありますか?

このような:

 truncate table #OBJ_AvailabilityTraining, #OBJ_AvailabilityHoliday, #Dates_temp;

よろしく

18
user2206834

いいえ、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変数ですべてのテーブル名をカンマで区切ることができます。はい、プレフィックスが付いている場合は異なるスキーマの複数のテーブルを切り捨てることができます。

5
IndoKnight

次のように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ステートメントを実行します

11
Pankaj Agarwal

いいえ。しかし、代替手段があります。

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

リンク1

リンク2

更新:

質問の例Queryの表を見る

truncate table #OBJ_AvailabilityTraining, #OBJ_AvailabilityHoliday, #Dates_temp

Truncate all一時テーブルにしたいと思います。

次のような単純なQueryでこれを行うことができます

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

次のMySQLステートメントを簡単に入力します。

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

... 等々。

yourtablenameをyoursで変更します。

セミコロンを忘れないでください。

2

ボーナスの例では、1つのデータベース内のすべてのテーブルを文字列で切り捨てます...

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

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ソリューションは、データベースの最新バージョンでは機能しなくなっている可能性があります。役に立てば幸いです。

0
Xavi Duro