我有一个存储过程,如果表中有相册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
如果我没有发送描述旧数据没有保留,它将被空数据覆盖。 如果我有任何错误,请有人帮助我。
答案 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