【发布时间】: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