我正在尋找正確的語法和直接從SQL執行以下操作的方法:插入或更新(如果數據已經存在於裏面)TableMain
來自TableA
中包含的數據,相同的組合主鍵。從複合主鍵的另一個表插入或更新表
兩個表被定義爲:
CREATE TABLE TableA (
[TID0] [int] NOT NULL,
[TID1] [int] NOT NULL,
[language] [nvarchar](2) NOT NULL,
[TID2] [nvarchar](200) NOT NULL,
[text] [nvarchar](max) NULL,
[updatedOn] [datetime] NOT NULL DEFAULT (getdate())
PRIMARY KEY (
[TID0],
[TID1],
[language],
[TID2],
)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
TableA
將被定期刪除和填充。
TableMain
作爲相同的定義,但將包含更多的數據行,我需要的是從TableA
插入從未見過的值到TableMain
,並更新已有的行。
我用來做這種插入的,但我不知道如何處理更新和複合主鍵:
INSERT INTO TableMain
SELECT * FROM TableA
編輯:我使用的SQL Server 9.00.5000
編輯:另一種方式MERGE啓發和mimick it
DECLARE @updatedIDs TABLE(
[TID0] [int],
[TID1] [int],
[language] [nvarchar](2),
[TID2] [nvarchar](200),
PRIMARY KEY ([TID0], [TID1], [language], [TID2]) -- as stated by Nikola Markovinović above, thanks
);
-- First update records
update TableMain
set [text] = source.[text],
[updatedOn] = source.[updatedOn]
OUTPUT
inserted.[TID0]
inserted.[TID1]
inserted.[language]
inserted.[TID2]
INTO @updatedIDs
from
TableMain AS main
, TableA AS source
WHERE
TableMain.[TID0] = source.[TID0]
and TableMain.[TID1] = source.[TID1]
and TableMain.[language] = source.[language]
and TableMain.[TID2] = source.[TID2]
-- And then insert
insert into TableMain
select *
from TableA AS source
where not exists
(
select 1
from @updatedIDs AS i
where i.[TID0] = source.[TID0]
and i.[TID1] = source.[TID1]
and i.[language] = source.[language]
and i.[TID2] = source.[TID2]
)
謝謝,順便說一句別人的答案也幫助我找到另一種使用OUTPUT條款(工作方式我也不知道:))...幾乎和你一樣的想法,把東西放在DECLARED表中看到:http://sqlserver-tips.blogspot.fr/2006/09/mimicking-merge-statement- in-sql.html 我不知道什麼是更有效的方法... – user1340802 2012-08-09 15:03:38
ps:我還爲未來添加了另一種方式,如果它可以幫助其他人 – user1340802 2012-08-09 15:14:04
@ user1340802輸出方式正確,速度可能更快,因爲所有未更新的源記錄都是新的,並且不必搜索可能更大的匹配項源表,但缺乏實現。表變量'@ updatedIDs'應該具有主鍵(TID0,TID1,language,TID2),否則Sql Server會假定它包含一行,因爲不會爲表變量收集統計信息。列應按選擇性順序排列 - 首先選擇性最強。這也適用於TableA。 – 2012-08-09 19:27:49