我有一个像这样的SP(使用SQL Server):
ALTER PROCEDURE [dbo].[sp_ClientNotes_update]
@id uniqueidentifier,
@ordering smallint = NULL,
@title nvarchar(20) = NULL,
@content text = NULL
AS
BEGIN
SET NOCOUNT ON;
UPDATE tbl_ClientNotes
SET ordering=@ordering, title=@title, content=@content
WHERE id=@id
END
我想只设置值,如果它们被传递到SP,即不是NULL。可以这样做吗?
This question似乎建议唯一的方法是使用完全独立的条件查询,但对于3个可选参数,这显然是一场噩梦!
答案 0 :(得分:39)
试试这个。
ALTER PROCEDURE [dbo].[sp_ClientNotes_update]
@id uniqueidentifier,
@ordering smallint = NULL,
@title nvarchar(20) = NULL,
@content text = NULL
AS
BEGIN
SET NOCOUNT ON;
UPDATE tbl_ClientNotes
SET ordering=ISNULL(@ordering,ordering),
title=ISNULL(@title,title),
content=ISNULL(@content, content)
WHERE id=@id
END
在WHERE
子句中添加一个额外的部分也是值得的,如果你使用事务复制,那么如果所有都是NULL,它将向订阅者发送另一个更新,以防止这种情况发生。
WHERE id=@id AND (@ordering IS NOT NULL OR
@title IS NOT NULL OR
@content IS NOT NULL)
答案 1 :(得分:3)
UPDATE tbl_ClientNotes
SET
ordering=ISNULL@ordering,ordering),
title=isnull(@title,title),
content=isnull(@content,content)
WHERE id=@id
我想我记得在此之前看到如果你正在更新到相同的值,SQL Server将实际识别这个并且不会进行不必要的写入。
答案 2 :(得分:3)
一个想法:
UPDATE tbl_ClientNotes
SET ordering=ISNULL(@ordering, ordering), title=ISNULL(@title, title), content=ISNULL(@content, content)
WHERE id=@id
答案 3 :(得分:0)
UPDATE tbl_ClientNotes
SET ordering=@ordering, title=@title, content=@content
WHERE id=@id
AND @ordering IS NOT NULL
AND @title IS NOT NULL
AND @content IS NOT NULL
或者,如果您的意思是您只想更新单个列,则可以使用我上面的帖子。我读它是因为如果任何值为null则不更新
答案 4 :(得分:0)
ALTER PROCEDURE LN
(
@Firstname nvarchar(200)
)
AS
BEGIN
UPDATE tbl_Students1
SET Firstname=@Firstname
WHERE Studentid=3
END
exec LN 'Thanvi'