Синтаксис слияния SQL Server 2008 - PullRequest
0 голосов
/ 08 июля 2011

Я в основном пытаюсь сделать что-то из 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

Помощь приветствуется.Спасибо!

Ответы [ 5 ]

3 голосов
/ 08 июля 2011

Вам нужно что-то вроде

    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;
2 голосов
/ 08 июля 2011

Вам не нужно предложение USING?

См. MERGE .

1 голос
/ 08 июля 2011

Использование 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')
0 голосов
/ 08 июля 2011

У вас есть один 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);
0 голосов
/ 08 июля 2011
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 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...