sql >> データベース >  >> RDS >> Sqlserver

SQLServerのデータベース内のすべてのテーブルを切り捨てる-SQLServer/TSQLチュートリアルパート55

    シナリオ:

    ETLプロセスに使用するデータベースについて考えてみましょう。このデータベースをステージングと呼びます。毎日のプロセスで使用できるように、午前中にすべてのテーブルを切り捨てたいと思います。 1つの方法は、テーブルごとにTruncateステートメントを作成することですが、テーブルを削除したり、新しいテーブルを作成したりすることもできます。データベースからすべてのテーブルを切り捨てるために使用できるクエリを作成したいので、Truncateステートメントを書き直す必要はありません。

    テーブルに主キー-外部キーがない場合関係では、Truncateを使用できます。しかし、他のテーブルから参照されるテーブルがあることがよくあります。これらのテーブルにTruncateステートメントを使用することはできません。これらのテーブルを切り捨てる唯一の方法は、切り捨てる前に外部キー制約を削除し、その後、関係を切り捨てて再作成することです。

    以下のコードを使用して、データベースからすべてのテーブルを切り捨てることができます。テーブルにPk-Fk関係がある場合、スクリプトは最初に外部キー制約を削除し、次にそれらのテーブルを切り捨てて、最後に外部キー制約を再作成します。

    スクリプトの下で実行する前に、次のことを確認してください。正しいデータベースとサーバーを指しています! SQLServerデータベースからすべてのテーブルを切り捨てることで最善を尽くします。


    -- Drop Temp Tables if Exists
     IF OBJECT_ID('tempdb..#DropConstraint') IS NOT NULL
      DROP TABLE #DropConstraint

     IF OBJECT_ID('tempdb..#CreateConstraint') IS NOT NULL
      DROP TABLE #CreateConstraint

     IF OBJECT_ID('tempdb..#TempTruncateTables') IS NOT NULL
        DROP TABLE #TempTruncateTables


    -- Drop Constraint Script Save in #DropConstraint Temp Table 
    SELECT 'ALTER TABLE ' + '['
           + Schema_name(o.schema_id) + '].['
           + OBJECT_NAME(FK.parent_object_id) + ']'
           + ' DROP  CONSTRAINT ' + '[' + FK.name + ']' AS DropConstraintQuery

     INTO   #DropConstraint
     FROM   sys.foreign_keys AS FK
           INNER JOIN sys.foreign_key_columns AS FKC
                   ON FK.OBJECT_ID = FKC.constraint_object_id
           INNER JOIN sys.objects O
                   ON O.OBJECT_ID = FKC.parent_object_id


    -- Create Constraint Script Save in #CreateConstraint Temp Table 
    SELECT 'ALTER TABLE ' + '['
           + Schema_name(o.schema_id) + '].' + '['
           + OBJECT_NAME(FK.parent_object_id) + ']'
           + ' ADD CONSTRAINT ' + '[' + FK.name
           + '] Foreign Key (['
           + (SELECT name
              FROM   sys.columns c
              WHERE  c.OBJECT_ID = FKC.parent_object_id
                     AND c.column_id = FKC.parent_column_id)
           + ']) REFERENCES ' + '['
           + Schema_name(o.schema_id) + '].['
           + (SELECT name
              FROM   sys.objects o
              WHERE  OBJECT_ID = FKC.referenced_object_id)
           + '] (['
           + (SELECT name
              FROM   sys.columns c
              WHERE  c.OBJECT_ID = FKC.referenced_object_id
                     AND c.column_id = FKC.referenced_column_id)
           + '])' AS CreateConstraintQuery

     INTO   #CreateConstraint
     FROM   sys.foreign_keys AS FK
           INNER JOIN sys.foreign_key_columns AS FKC
                   ON FK.OBJECT_ID = FKC.constraint_object_id
           INNER JOIN sys.objects o
                   ON FKC.parent_object_id = o.OBJECT_ID

    -- Build Truncate Statement for all the tables and save into #TempTruncateTables
     SELECT 'Truncate table ' + Schema_name(schema_id)
           + '.' + name AS TruncateTableQuery

     INTO   #TempTruncateTables 
    FROM   sys.tables
     WHERE  TYPE = 'U'
           AND is_ms_shipped = 0

    GO


    -- Drop Constraints
     DECLARE @DropConstraintQuery AS VARCHAR(4000)
     DECLARE DropConstraintCur CURSOR FOR
      SELECT DropConstraintQuery
      FROM   #DropConstraint

     OPEN DropConstraintCur 
    FETCH Next FROM DropConstraintCur 
     INTO @DropConstraintQuery
     WHILE @@FETCH_STATUS = 0
      BEGIN
          DECLARE @SQL VARCHAR(MAX)=NULL
          SET @SQL=@DropConstraintQuery
          EXEC (@SQL)
          PRINT ' Query ::' + @DropConstraintQuery
                + 'Completed'
          FETCH Next FROM DropConstraintCur INTO @DropConstraintQuery
      END
    CLOSE DropConstraintCur 

    DEALLOCATE DropConstraintCur
    GO-- Truncate tables 

    DECLARE @TempTruncateTablesCur AS VARCHAR(4000) 
    DECLARE TempTruncateTablesCur CURSOR FOR
      SELECT TruncateTableQuery
      FROM   #TempTruncateTables 

    OPEN TempTruncateTablesCur
     FETCH Next FROM TempTruncateTablesCur 
     INTO @TempTruncateTablesCur
     WHILE @@FETCH_STATUS = 0
      BEGIN
          DECLARE @SQL VARCHAR(MAX)=NULL

          SET @SQL=@TempTruncateTablesCur

          EXEC (@SQL)

          PRINT ' Query ::' + @TempTruncateTablesCur
                + 'Completed'
          FETCH Next FROM TempTruncateTablesCur INTO @TempTruncateTablesCur
      END
    CLOSE TempTruncateTablesCur 

    DEALLOCATE TempTruncateTablesCur
    GO



    -- Create Constraint After Truncate 
    DECLARE @CreateConstraintQuery AS VARCHAR(4000) 
    DECLARE CreateConstraintQueryCur CURSOR FOR
      SELECT CreateConstraintQuery
      FROM   #CreateConstraint

     OPEN CreateConstraintQueryCur 
    FETCH Next FROM CreateConstraintQueryCur 
     INTO @CreateConstraintQuery 
    WHILE @@FETCH_STATUS = 0
      BEGIN
          DECLARE @SQL VARCHAR(MAX)=NULL
          SET @SQL=@CreateConstraintQuery
          EXEC (@SQL)
          PRINT ' Query ::' + @CreateConstraintQuery
                + 'Completed'
          FETCH Next FROM CreateConstraintQueryCur INTO  @CreateConstraintQuery
      END
    CLOSE CreateConstraintQueryCur

     DEALLOCATE CreateConstraintQueryCur

    GO 




    Things we covered in this Post
    • How to drop temp table if exists in SQL Server
    • How to use system tables to get Primary key and foreign key Constraint
    • How to use Cursors in SQL Server 
    • How to Drop Foreign Key Constraints dynamically and Recreate them
    • How to Truncate all tables in SQL Server Database
    • How to use Dynamic SQL in TSQL
    • How to use Variables in TSQL

    1. MariaDBでのTRIM()のしくみ

    2. DatabaseConfigurationAssistantを使用したOracle12cのサンプルスキーマのインストール

    3. PostgreSQLで一時関数を作成するにはどうすればよいですか?

    4. SQL Serverエージェントジョブ(T-SQL)のジョブステップを更新する