【问题标题】:T-SQL UPSERT table with multiple values from TVP具有来自 TVP 的多个值的 T-SQL UPSERT 表
【发布时间】: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


【解决方案1】:

试试这个:

您需要将 YourColumn 替换为 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

【讨论】:

    猜你喜欢
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    相关资源
    最近更新 更多