Tsql 具有来自TVP的多个值的T-SQL UPSERT表
我使用SQL Server 2012和T-SQL作为查询语言 我需要帮助更新/插入[cross_function_user]中的多个列,使用作为参数(@userGroupID)传递的一个ID值和许多函数ID。它们以C#的形式列出,并作为表值参数传递给存储过程,其中只有一列int,命名为ItemTsql 具有来自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
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,链接中的文章帮助你完美地解决了这个问题!