【问题标题】:update field that could be null in stored procedure更新存储过程中可能为空的字段
【发布时间】:2013-09-28 21:58:13
【问题描述】:

我有一个包含两列可能为空的表。

我想构建一个存储过程来编辑该表。在存储过程中我这样做了:

@ID INT,
    @newBuildingName NVARCHAR(250),
    @newLocation NVARCHAR(3000),
    @newImage VARBINARY(MAX) = NULL,
    @newNote NVARCHAR(3000) = NULL,
    @result BIT OUTPUT

在这一点上我不能确定用户是否输入了newImagenewNote 字段的值,所以我不能说

UPDATE myTable SET image = @newImage, note = @newNote

因为这两个字段可能已经有值,因此我将删除这些值,

我该怎么办?

我是什么 做一个if-else 语句并尝试第一个字段是否为空,所以在没有它的情况下进行更新,然后如果我的第二个字段为空,则在没有它的情况下进行更新语句,如果它们都不为空,则进行完整的更新语句,但我这是一个非常乏味的过程。

请问有其他解决方法吗?

提前致谢

【问题讨论】:

    标签: jquery sql-server database sql-server-2008-r2


    【解决方案1】:

    您可以使用合并功能:

    UPDATE myTable 
    SET 
        image = COALESCE(@newImage,image),
        note = COALESCE(@newNote,note)
    

    如果图像不为空,则不会更改。备注栏也是如此

    【讨论】:

    • 但是这种情况下如果已经不为null,就不会有更新了,请问有什么解决办法?
    • 交换值,即image = Coalesce( @newImage, image ),如果新值不为NULL,将更新该字段。明确的方法是为每个模糊字段添加一点,并使用类似image = case when @SetImage = 1 then @newImage else image end.
    • 按照 HABO 的建议交换合并参数
    【解决方案2】:

    以这样一种方式制作 if-else 语句,您可以在不实际提交更新的情况下决定要更新的实体。

    您的代码中必须已经具有整个实体的值,例如在您的模型中。请检查以下情况。

    if(!String.IsNullOrEmpty(@newImage))
    {
         //include the values @newImage to the entity to update
    }
    if(!String.IsNullOrEmpty(@newNote))
    {
         //include the values @newNoteto the entity to update
    }
    EntityToUpdate.saveChangestoDB();
    

    【讨论】:

    • 请问您确定吗?这是我数据库中非常重要的部分
    • 什么是 entityToUpdate ?
    • 无论何时从 DB 获取数据或写回 DB 时,将数据实体保持在一起是一种很好的做法。在您的情况下,它只是概念性的
    • 请关注@Gruff Bunny 的回答。它优雅而整洁。
    【解决方案3】:

    试试这个:

    UPDATE myTable 
    SET image = CASE WHEN image IS NULL THEN @newImage ELSE image END
    ,note = CASE WHEN note IS NULL THEN @newNote ELSE note END
    

    当然,您可能还想使用 ISNULL 函数...例如

    note = CASE WHEN ISNULL(note,'') = '' THEN @newNote ELSE note END

    同时处理 note IS NULL 和 note 等于 ''(空字符串)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多