簡體   English   中英

合並語法 SQL 服務器 2008

[英]Merge Syntax SQL Server 2008

我基本上是在嘗試從 MYSQL 做的事情,它是 INSERT 和 ON DUPLICATE 等。

但是,我的“合並”語法出現錯誤。 這個存儲過程接受一個變量“@ID”,它是一個 guid,並在表中查看它是否已經存在——如果存在,則插入一個新條目,否則更新現有條目。 我無法弄清楚這里有什么問題!

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE usp_DigitalTool_InsertUpdate2
(@ID uniqueidentifier, @TOOL_ID uniqueidentifier, @INPUT_ID uniqueidentifier)

AS

MERGE 
INTO  DigitalTool as target
USING (SElECT @ID,@TOOL_ID,@INPUT_ID) as source(id, tool_id, input_id) 
ON (target.ID = source.id)
when matched then  
 update
  set TOOL_ID = source.tool_id,
    INPUT_ID = source.input_id
when not matched then
insert ( ID, TOOL_ID, INPUT_ID)
    values ( NEWID(), source.tool_id, source.input_id)

END
GO

幫助表示贊賞。 謝謝!

你需要類似的東西

    MERGE 
INTO  DigitalTool as target
USING (SElECT @ID,@TOOL_ID,@INPUT_ID) as source(id, tool_id, input_id) 
ON (target.id = source.id)
when matched then  
 update
  set TOOL_ID = source.tool_id,
    INPUT_ID = source.input_id
when not matched then
insert ( ID, TOOL_ID, INPUT_ID)
    values ( NEWID(), source.tool_id, source.input_id)

更新。

您的程序中有幾個錯誤( BEGIN遺漏,以及最后的分號)。 它應該看起來:

CREATE PROCEDURE usp_DigitalTool_InsertUpdate2
(@ID uniqueidentifier, @TOOL_ID uniqueidentifier, @INPUT_ID uniqueidentifier)  
AS
BEGIN 
 MERGE 
 INTO  DigitalTool as target
 USING (SElECT @ID,@TOOL_ID,@INPUT_ID) as source(id, tool_id, input_id) 
 ON (target.ID = source.id)
 when matched then  
 update
 set TOOL_ID = source.tool_id,
   INPUT_ID = source.input_id
 when not matched then
 insert ( ID, TOOL_ID, INPUT_ID)
  values ( NEWID(), source.tool_id, source.input_id);
END;

你不需要USING子句嗎?

請參閱合並

使用 TSQL 可以使用 EXISTS 關鍵字來判斷是否找到一條記錄,如下所示。

IF EXISTS(
 SELECT 1
 FROM MY_TABLE
 WHERE ITEM='somevalue' AND ENTERDATE='12/31/1999')
    --Update Statement
    UPDATE MY_TABLE
    SET ITEM='anothervalue'
    WHERE ITEM='somevalue' AND ENTERDATE='12/31/1999'
ELSE
    --Insert Statement
    INSERT INTO MY_TABLE
    (ITEM, ENTERDATE)
    VALUES
    ('somevalue', '12/31/1999')
merge DigitalTool 
using (select ID from Table_name) as tbl
ON tbl.ID = @ID
when matched then
    update
    set TOOL_ID = '@TOOL_ID',
        INPUT_ID = '@INPUT_ID'
when not matched then
    insert ( ID, TOOL_ID, INPUT_ID)
        values ( NEWID(), @TOOL_ID, @INPUT_ID )

你有一個END很多, MERGE需要以;結束。

CREATE PROCEDURE usp_DigitalTool_InsertUpdate2
(@ID uniqueidentifier, @TOOL_ID uniqueidentifier, @INPUT_ID uniqueidentifier)

AS

MERGE 
INTO  DigitalTool as target
USING (SElECT @ID,@TOOL_ID,@INPUT_ID) as source(id, tool_id, input_id) 
ON (target.ID = source.id)
when matched then  
 update
  set TOOL_ID = source.tool_id,
    INPUT_ID = source.input_id
when not matched then
insert ( ID, TOOL_ID, INPUT_ID)
    values ( NEWID(), source.tool_id, source.input_id);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM