使用 SQL 服务器 MERGE 语句
Using SQL Server MERGE statement
我有 3 个相关的 table:
而且我需要创建一个存储过程来保存新订单。我遵循我正在从事的项目中的现有实践,这是我的 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]
table 添加数据。它几乎可以工作,但应该像
INSERT ([arenaId], [typeId] [key], [author])
VALUES (@arenaId, "HOW TO GET TYPEID HERE?" t.[groupKey], @author);
我不知道如何获得 [typeId]
值,我尝试在 INSERT
中使用嵌套的 SELECT
语句,但似乎不允许这样做。
如有任何帮助,我们将不胜感激。谢谢。
您也必须在 OrderTypes 中创建一个条目,或者必须将 TypeId 作为参数传递。 SQL 服务器不能只为您猜测一个 ID。
顺便说一句:MERGE 语句很好,但它有几个问题和限制。最好使用 INSERT INTO ... SELECT FROM ... WHERE NOT EXISTS (或者最好用两个语句来做,先检查不存在,然后仅在 COUNT(*) = 0.
时插入
我有 3 个相关的 table:
而且我需要创建一个存储过程来保存新订单。我遵循我正在从事的项目中的现有实践,这是我的 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]
table 添加数据。它几乎可以工作,但应该像
INSERT ([arenaId], [typeId] [key], [author])
VALUES (@arenaId, "HOW TO GET TYPEID HERE?" t.[groupKey], @author);
我不知道如何获得 [typeId]
值,我尝试在 INSERT
中使用嵌套的 SELECT
语句,但似乎不允许这样做。
如有任何帮助,我们将不胜感激。谢谢。
您也必须在 OrderTypes 中创建一个条目,或者必须将 TypeId 作为参数传递。 SQL 服务器不能只为您猜测一个 ID。
顺便说一句:MERGE 语句很好,但它有几个问题和限制。最好使用 INSERT INTO ... SELECT FROM ... WHERE NOT EXISTS (或者最好用两个语句来做,先检查不存在,然后仅在 COUNT(*) = 0.
时插入