T-Sql

插入不存在的記錄

  • March 6, 2020

我們正在從一個數據庫升級到另一個數據庫。兩個數據庫都有相同的表,例如,假設我們有 dbOld 和 dbNew。我需要一種方式

對於 dbNew 上的每個表,檢查 dbOld 上的表 - 將 dbOld 中存在的所有行插入 dbNew

我將如何通過程式碼做到這一點?

編輯

這是我正在查看的程式碼。顯然存在問題,但這會是一個好方法嗎?

Declare @tablename varchar(max)

Declare cursor_tables Cursor

For SELECT TABLE_NAME
   FROM INFORMATION_SCHEMA.TABLES
   WHERE TABLE_TYPE = 'BASE TABLE' 
   AND TABLE_CATALOG='salesData' 

OPEN cursor_tables

FETCH NEXT FROM cursor_tables INTO @tablename;

WHILE @@FETCH_STATUS = 0
BEGIN
  insert dbNew.dbo. + @tablename
  select *
     from dbOld.dbo. + @tablename
     except (
     select *
       from dbNew.dbo. + @tablename)

FETCH NEXT FROM cursor_tables INTO @tablename;
END;

您不能從 TSQL 中的變數中給出對象名稱,因此您必須有點 hacky 並將語句作為字元串並作為 ad-hoc SQL 執行。就像是:

SET @SQL = '
       INSERT dbNew.dbo. + @tablename
       SELECT * FROM dbOld.dbo.' + @tablename + '
       EXCEPT 
       SELECT * FROM dbNew.dbo.' + @tablename + '
       '
EXEC (@SQL)

您可能會發現以下更有效:

SET @SQL = '
       INSERT dbNew.dbo. + @tablename
       SELECT * FROM dbOld.dbo.' + @tablename + ' oTbl
       EXCEPT 
       LEFT OUTER JOIN dbNew.dbo.' + @tablename + ' nTbl
       ON nTbl.primaryKey = oTlb.primaryKey
       '
EXEC (@SQL)

但這確實意味著您需要通過在游標中查詢更多INFORMATION_SCHEMA/sys.*結構來確定主鍵列是什麼。

在精心設計的數據庫中,您將遇到的另一個複雜情況是,您需要對錶填充進行排序,以確保在此過程中始終滿足外鍵約束(或先刪除此類約束並在傳輸後讀取它們)。

引用自:https://dba.stackexchange.com/questions/261318