Tsql 具有来自TVP的多个值的T-SQL UPSERT表

Tsql 具有来自TVP的多个值的T-SQL UPSERT表,tsql,sql-server-2012,upsert,table-valued-parameters,Tsql,Sql Server 2012,Upsert,Table Valued Parameters,我使用SQL Server 2012和T-SQL作为查询语言 我需要帮助更新/插入[cross_function_user]中的多个列,使用作为参数(@userGroupID)传递的一个ID值和许多函数ID。它们以C#的形式列出,并作为表值参数传递给存储过程,其中只有一列int,命名为Item ALTER PROCEDURE [whatever] @userGroupID INT, @listID AS IntList READONLY AS BEGIN S

我使用SQL Server 2012和T-SQL作为查询语言

我需要帮助更新/插入[cross_function_user]中的多个列,使用作为参数(@userGroupID)传递的一个ID值和许多函数ID。它们以C#的形式列出,并作为表值参数传递给存储过程,其中只有一列int,命名为Item

ALTER PROCEDURE [whatever]
    @userGroupID INT,
    @listID AS IntList READONLY
AS
BEGIN   
        SET NOCOUNT ON;
    MERGE INTO [dbo].[cross_function_user] USING @listID
    ON [dbo].[cross_function_user].id_group_user = @userGroupID
    WHEN MATCHED THEN
        UPDATE SET [cross_function_user].id_group_user = @userGroupID,
                   [cross_function_user].id_function = (SELECT Item FROM @listID)
    WHEN NOT MATCHED THEN
        INSERT (id_group_user, id_function) 
        VALUES (@userGroupID, (SELECT Item FROM @listID) );

END
首先,it错误‘子查询返回了多个结果’当然,但我缺乏重写这一结果的技能,我也不确定我的upsert是否正确编写。任何帮助都将不胜感激。

试试以下方法:

您需要将您的列替换为TVP中的列的名称

ALTER PROCEDURE [whatever]
@userGroupID INT,
@listID AS IntList READONLY
AS
BEGIN   
    SET NOCOUNT ON;
    MERGE INTO [dbo].[cross_function_user] USING @listID
    ON [dbo].[cross_function_user].id_group_user = @userGroupID
    WHEN MATCHED THEN
        UPDATE SET [cross_function_user].id_function = S.YourColumn
    WHEN NOT MATCHED THEN
        INSERT (id_group_user, id_function) 
        VALUES (@userGroupID, S.YourColumn);

END

IntList中只有一列吗?它叫什么?您需要在MERGE语句中引用一列。在这个例子中,你可以看到你应该给你的TVP加上别名,并参考其中的专栏谢谢你,ElectriLlama,链接中的文章帮助你完美地解决了这个问题!