0

我有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

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

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

我不知道如何获得[typeId]价值,我尝试在SELECT里面使用嵌套语句INSERT,但似乎是不允许的。

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

4

1 回答 1

3

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

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

于 2015-04-30T13:59:19.833 回答