【问题标题】:Using SQL Server MERGE statement使用 SQL Server MERGE 语句
【发布时间】:2015-04-30 13:32:36
【问题描述】:

我有 3 个相关的表:

我需要创建一个存储过程来保存新订单。我遵循我正在处理的项目中的现有实践,这是我的 sql 代码,首先创建自定义类型:

-- create custom type that will be used later as SP parameter type
CREATE TYPE [dbo].[Admin_Batch_TOrderTable] AS TABLE
(
    [groupKey] varchar(100) NOT NULL,
    [key] varchar(100) NOT NULL,
    [value] nvarchar(MAX) NULL
)
GO

然后创建存储过程本身来保存新订单:

CREATE PROCEDURE [dbo].[Admin_Batch_Order_Save]
    @arenaId smallint,
    @table AS [dbo].[Admin_Batch_TOrderTable] READONLY,
    @author nvarchar(100) = NULL
AS
    MERGE [dbo].[OrderGroup] AS g -- TARGET
        USING (SELECT DISTINCT [groupKey] FROM @table) AS t -- SOURCE
        ON g.[key] = t.[groupKey] AND g.[arenaId] = @arenaId
    WHEN NOT MATCHED BY TARGET THEN
        INSERT ([arenaId], [key], [author]) VALUES (@arenaId, t.[groupKey], @author);

        DECLARE @output TABLE ([action] varchar(20), [id] int)

RETURN 0

因此,当调用存储过程时,它将首先尝试使用MERGE 语句将数据添加到[dbo].[OrderGroup] 表中。它几乎可以工作,但它应该像

INSERT ([arenaId], [typeId] [key], [author]) 
VALUES (@arenaId, "HOW TO GET TYPEID HERE?" t.[groupKey], @author);

我不知道如何获得[typeId] 的值,我尝试在INSERT 中使用嵌套的SELECT 语句,但似乎不允许这样做。

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 这个 TYPEID 是从哪里来的?它不在您发布的代码中。不知道为什么需要在这里使用 MERGE。这看起来像是一个不存在的基本插入。你也可以看看这篇关于 MERGE 的文章。 mssqltips.com/sqlservertip/3074/…
  • 对不起。 typid 应该由 typekey 检测,这是我错过的 SP 中的附加参数。无论如何,谢谢,我会尝试用插入替换合并。

标签: sql sql-server tsql sql-merge


【解决方案1】:

您也必须在 OrderTypes 中创建一个条目,或者必须将 TypeId 作为参数传递。 SQL Server 不能只为您猜测 ID。

顺便说一句:MERGE 语句很好,但它存在一些问题和限制。最好使用 INSERT INTO ... SELECT FROM ... WHERE NOT EXISTS (或者最好使用两条语句,先检查不存在,然后仅在 COUNT(*) = 0 时插入。

【讨论】:

    猜你喜欢
    • 2020-10-13
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    相关资源
    最近更新 更多