T-Sql
插入不存在的記錄
我們正在從一個數據庫升級到另一個數據庫。兩個數據庫都有相同的表,例如,假設我們有 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.*
結構來確定主鍵列是什麼。在精心設計的數據庫中,您將遇到的另一個複雜情況是,您需要對錶填充進行排序,以確保在此過程中始終滿足外鍵約束(或先刪除此類約束並在傳輸後讀取它們)。