【问题标题】:Merge Syntax SQL Server 2008合并语法 SQL Server 2008
【发布时间】:2011-10-01 11:21:51
【问题描述】:

我基本上是在尝试从 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

感谢您的帮助。谢谢!

【问题讨论】:

  • 什么是@TOOL_ID@INPUT_ID?为什么它在一种情况下用作文本值,而在另一种情况下显然用作参数?
  • @TOOL_ID 和 @INPUT_ID 作为参数传入,如果 ID 对表来说是唯一的,则更新字段。

标签: c# asp.net sql-server-2008 stored-procedures merge


【解决方案1】:

你需要类似的东西

    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;

【讨论】:

  • 我仍然收到与此代码相同的错误:(。选择应该选择什么?列名?因为他们不使用实际数据库中的@,只有当他们作为参数进来。
  • 你得到什么样的错误?我认为这段代码一切都很好。
  • 对我来说也是正确的。但是,这些错误消息是无用的。'MERGE' 附近的语法不正确。关键字“as”附近的语法不正确。
  • 糟糕。我想我知道(这是UPDATE 的印刷错误——应该是source.input_id,而不是source_input_id)。我会更新我的答案
  • 修复了这个问题,但仍然是老错误。我觉得好像我把它上面的东西搞砸了,尽管一切都和我用过的许多其他 SP 完全相同。
【解决方案2】:

您不需要USING 子句吗?

MERGE

【讨论】:

  • 谢谢。我认为这可能是一个问题,但你将如何实际编码?我查看了一些示例并自己尝试了一些示例,但它们似乎对我不起作用。如果我想要的条件在ON语句中如上,我怎么写使用???
【解决方案3】:

使用 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')

【讨论】:

  • 如果我能和你握手我会的,但你现在已经无法触及。谢谢!
  • 如果@@rowcount=0,插入,您也可以通过更新来创建Link
【解决方案4】:
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 )

【讨论】:

  • 我试过了,但仍然收到错误消息,提示“MERGE”和“AS”周围的语法不正确。是我合并到我正在使用的同一张表上的问题吗?
【解决方案5】:

你有一个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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 2012-03-28
    • 2011-06-28
    相关资源
    最近更新 更多