使用SQL Server合并语句

使用SQL Server合并语句,sql,sql-server,tsql,sql-merge,Sql,Sql Server,Tsql,Sql Merge,我有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

我有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
语句,但这似乎是不允许的


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

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


顺便说一句:MERGE语句很好,但是有几个问题和限制。最好使用插入到。。。从…中选择。。。如果不存在(或者最好使用两条语句,首先检查不存在,并仅在COUNT(*)=0时插入。

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


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

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


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

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


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

此TYPEID来自何处?它不在您发布的代码中。不确定您为什么需要在此处使用MERGE。这看起来像是一个基本的插入。您也可以浏览一下这篇关于MERGE的文章。很抱歉。TYPEID应该由typekey检测,这是SP中我错过的附加参数。无论如何,谢谢,我将尝试重新显示e merge with insert。这个TYPEID来自哪里?它不在你发布的代码中。不确定你为什么需要在这里使用merge。这看起来像是一个基本的插入,不存在。你也可以看看这篇关于merge的文章。很抱歉。TYPEID应该由typekey检测,这是SP中我错过的附加参数。无论如何,谢谢,我将y将合并替换为插入。此TYPEID来自何处?它不在您发布的代码中。不确定您为什么需要在此处使用合并。这看起来像是一个基本的插入,不存在。您也可以浏览一下这篇关于合并的文章。很抱歉。TYPEID应该由typekey检测,这是SP中我错过的附加参数。谢谢,我将尝试用insert替换merge。此TYPEID来自何处?它不在您发布的代码中。不确定您为什么需要在此处使用merge。这看起来像是一个基本的insert,不存在。您也可以浏览一下这篇关于merge的文章。很抱歉。TYPEID应该由typekey检测,这是SP中我错过的附加参数。Thanks无论如何,我将尝试用insert替换merge。