2013-06-28 16 views
1

我有一個序列,我需要使用重新計算主鍵中的兩個字段,如果沒有找到更新匹配。是否可以在這裏繼續使用MERGE語句?我嘗試了什麼時候開始比賽,但是BEGIN在這裏無效。當不匹配時有多個步驟可能?

具體來說,我有一對組成主鍵的數字。第一個是分組,第二個是組內的一系列項目。如果出現問題,該組進入99990,我需要將它與序列結合起來,並使用一個序列來增加,然後將其分開。所以,當組進來99990時,我的計算組可以從99990到99999的範圍內,然後序列號的範圍從00到99.

我想不出一種方法來做到這一點INSERT賦值,並且我無法弄清楚如何使MERGE執行多個步驟,所以我猜我回到了UPDATE,IF @@ ROWCOUNT = 0 BEGIN。任何人都有更快的方法來做到這一點?

+0

您正在使用哪些DBMS?用'@@ rowcount'來判斷可能是SQL Server? –

+0

就像你猜測的那樣,它就是SQL Server。 – knockNrod

回答

0

不幸的是,不可能在MERGE中執行多個步驟。有時可以使用新的公共表達式語法,但是我使用了UPDATE,IF @@ ROWcOUNT = 0,INSERT,因此我可以在插入中執行多個步驟。

3

這工作,

  1. 聲明稱爲@isinsert
  2. 標記變量(位)的1
  3. 值在更新子句初始化它它設置爲0。

像這樣:(假設一個表名爲table1,帶有一個數字'id'字段和一個nvarchar'field1'字段)。

declare @id numeric(18,0)     -- That's the he lookup key 
set @id=999        -- We use id as the search key 
              -- You can use any other field  
declare @field nvarchar(50) 
set @field = 'insert or update value(s)' -- This is the new value 

declare @isinsert bit      -- This is a flag that will 
set @isinsert=1       -- indicate whether an insert or 
              -- an update were performed 

MERGE table1 AS target 
    USING (SELECT @field) AS source (field1) 
    ON (target.id = @id) 
    WHEN MATCHED THEN 
     UPDATE SET field1 = source.field1 
     ,@isinsert = 0      -- Set @isinsert to 0 on updates 
    WHEN NOT MATCHED THEN 
     INSERT (field1) 
     VALUES (source.field1); 

if (@isinsert=1) print concat('inserted record at id: ',@@IDENTITY) 
else print concat('updated record at id: ',@id) 
+0

Kewl。我還沒有時間去討論這個問題,但看起來很有趣。我懷疑我會學習新的東西。本着這種精神,我正在對此投票。使用它已經太遲了,但學習新的東西永遠不會太晚。謝謝。 – knockNrod

相關問題