在Sql server中使用COALESCE

时间:2014-11-11 09:53:09

标签: sql sql-server tsql

我有一个存储过程,如果表中有相册ID,它将更新相册详细信息,如果没有,它将添加新记录。 用户有时可以更新所有值,或者有时会留下一些值。因此,如果用户保留更新旧数据的值,则应保留在表中。 为此,我找到了在sql中使用coasece的解决方案......

我把我的SP写成:

 UPDATE [dbo].[tbl_M_Album]

   SET [AlbumName] = @AlbumName
      ,[ImageName] = @Imagename
      ,[Description] = coalesce(@Description,[Description])
      ,[Imagepath] = @Imagepath
      ,[UpdatedBy] = @CreatedBy
      ,[UpdatedDate] = @CreatedDate
      where AlbumID =@AlbumId
      end

如果我没有发送描述旧数据没有保留,它将被空数据覆盖。 如果我有任何错误,请有人帮助我。

3 个答案:

答案 0 :(得分:3)

您传递的@Description的值为空或空,而不是NULL

COALESCE和其他空检查函数将''视为非空值。

这些都是真的,

NULL IS NULL

'' IS NOT NULL

' ' IS NOT NULL

如果您要查看NULL''(空)或' '(空格),可以使用

COALESCE(LEN(TRIM(@Description)), 0) = 0

或仅适用于NULL且为空,

COALESCE(LEN(@Description), 0) = 0

但是,避免传递空值或空值会更有效。


您可以像这样重写您的SP

IF COALESCE(LEN(TRIM(@Description)), 0) = 0
    UPDATE [dbo].[tbl_M_Album]
        SET
                 [AlbumName] = @AlbumName
                ,[ImageName] = @Imagename
                ,[Imagepath] = @Imagepath
                ,[UpdatedBy] = @CreatedBy
                ,[UpdatedDate] = @CreatedDate
        WHERE
                 [AlbumID] = @AlbumId;
 ELSE
     UPDATE [dbo].[tbl_M_Album]
        SET
                 [AlbumName] = @AlbumName
                ,[ImageName] = @Imagename
                ,[Description] = @Description
                ,[Imagepath] = @Imagepath
                ,[UpdatedBy] = @CreatedBy
                ,[UpdatedDate] = @CreatedDate
         WHERE
                 [AlbumID] = @AlbumID;

答案 1 :(得分:1)

检查为@Description指定的值是空字符串还是NULL。如果你在@Description中传递一个空字符串,那就是问题所在。只传递NULL将"默认"到下一个非空值(这适用于COALESCE或ISNULL)。

希望这有帮助。

答案 2 :(得分:0)

使用此查询。

UPDATE [dbo].[tbl_M_Album]

   SET [AlbumName] = @AlbumName
      ,[ImageName] = @Imagename
      ,[Description] = Case WHEN (@Description IS NULL OR LTRIM(RTRIM(@Description) = '') 
                            THEN [Description]
                            ELSE @Description
      ,[Imagepath] = @Imagepath
      ,[UpdatedBy] = @CreatedBy
      ,[UpdatedDate] = @CreatedDate
      where AlbumID =@AlbumId
      end