簡體   English   中英

使用SQL Server MERGE語句

[英]Using SQL Server MERGE statement

我有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語句很好,但是它有一些問題和限制。 最好使用INSERT INTO ... SELECT FROM ... WHERE NOT EXISTS(或者最好使用兩個語句來執行此操作,並首先檢查不存在,然后僅在COUNT(*)= 0時插入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM