我正在連接兩個數據庫進行數據遷移。我想檢查第二個數據庫中是否存在第一個數據庫表中的記錄。如何在SQL Server 2005中編寫INSERT IF NOT EXISTS查詢
I.e.從源數據庫用戶表我希望將數據遷移到目標數據庫用戶表。
如何使用if not exists來編寫查詢?
我正在連接兩個數據庫進行數據遷移。我想檢查第二個數據庫中是否存在第一個數據庫表中的記錄。如何在SQL Server 2005中編寫INSERT IF NOT EXISTS查詢
I.e.從源數據庫用戶表我希望將數據遷移到目標數據庫用戶表。
如何使用if not exists來編寫查詢?
SQL2003定義MERGE
,否則你可以做一個INSERT INTO ... SELECT
並在SELECT
你應該LEFT JOIN
使用在ON
謂語自然鍵的目標表,然後就在WHERE <column> IS NULL
卡盤。
+1的支持,但看起來像現在編輯的問題是指SQL Server 2005而不是「標準SQL」 – 2011-05-21 10:56:56
SQL Server 2005沒有MERGE命令。 ... – 2011-05-21 12:10:20
我的答案不是特定於SQL Server的。 – 2011-05-22 00:47:12
insert into myTable
select * from myOldTable ot
where NOT EXISTS (select 1 from mytable t where t.ID = ot.ID)
您可能會更好寫它作爲加入
insert into myTable
select ot.*
from myOldTable ot
LEFT JOIN mtTable t
ON ot.ID = t.ID
WHERE t.ID IS NULL
,或者根據您的數據庫,合併可能會更好,有很多的選擇
這兩種情況都存在競爭條件的可能性,因此OP需要一個唯一的約束或額外的鎖定提示。 – 2011-05-21 10:57:29
@Martin,你說得對,加上WITH(SERIALIZABLE,UPDLOCK)'應該可以解決這個問題,我相信 – 2011-05-21 11:02:58
其實剛剛注意到Andomar的觀點,即這是爲了數據遷移,所以OP可能不需要擔心這一點。 – 2011-05-21 11:05:05
我發現下面的語法簡單閱讀:
insert TargetTable
(col1, col2)
from SourceTable as source
where not exists
(
select *
from TargetTable as duplicate
where source.col1 = duplicate.col1
and source.col2 = duplicate.col2
)
通常,您不必擔心數據遷移過程中的併發性。如果這樣做,您可以指定鎖定提示,如with (tablock)
或更高transaction isolation level
。或者,您可以按照建議使用merge
,但這有一個相當複雜的語法。
謝謝andomar..this是我搜索的.. – ammu 2011-05-22 06:10:32
select * from db1.schema1.table1
intersect
select * from db2.schema2.table2
以及如何和在哪裏**插入**新行??? – 2011-05-21 12:10:47
哪個版本的標準SQL? 「合併」是標準SQL,但不受所有RDBMss – 2011-05-21 10:51:03