【发布时间】:2013-02-01 04:42:14
【问题描述】:
我使用 SQL Server 2012 和 T-SQL 作为查询语言。
我需要帮助更新/插入 [cross_function_user] 中的多个列,使用作为参数传递的一个 ID 值 (@userGroupID) 和许多函数 ID。它们是 C# 中的 List,并作为表值参数传递给 sproc - 只有一列 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
首先,它当然会出错“子查询返回多个结果”,但我缺乏重写此内容的技巧,而且我不确定我的 upsert 是否以正确的方式编写。任何帮助将不胜感激。
【问题讨论】:
-
IntList 中是否只有一列?这叫什么?您需要在 MERGE 语句中引用一列。在此示例中,您可以看到您应该为 TVP 设置别名并引用其中的列sqlblogcasts.com/blogs/simons/archive/2008/06/17/…
-
谢谢你,ElectriLlama,链接中的文章帮助完美解决了这个问题!
标签: tsql sql-server-2012 upsert table-valued-parameters