我不想为数据库中的用户提供大量不同的编辑方法,而是只想编写一种方法,既可以处理所有内容,又可以让客户端将字段留空。 如果将该字段留为空白,则不会进行任何编辑,并且该值将保持不变。
到目前为止,我的脚本看起来像这样,但是您可能会猜到,它不起作用:
USE [Library]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[editUserByID]
@ID INT,
@username VARCHAR(255),
@password VARCHAR(255),
@mail VARCHAR(255)
AS
BEGIN
SET NOCOUNT ON;
UPDATE dbo.users
SET dbo.users.username = @username,
dbo.users.password = @password,
dbo.users.mail = @mail
WHERE dbo.users.ID = @ID
END
预先感谢
答案 0 :(得分:1)
COALESCE是解决之道,只需将变量设置为null。
答案 1 :(得分:1)
COALESCE()
是正确的方法,您只需要将参数默认设置为NULL
,这样即使未提供这些参数,proc也不会失败。
USE [Library]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[editUserByID]
@ID INT,
@username VARCHAR(255) = NULL,
@password VARCHAR(255) = NULL,
@mail VARCHAR(255) = NULL
AS
BEGIN
SET NOCOUNT ON;
UPDATE dbo.users
SET username = COALESCE(@username, username),
password = COALESCE(@password,password),
mail = COALESCE(@mail, mail)
WHERE dbo.users.ID = @ID
END
我假设@ID
永远不会是NULL
,您可以设置默认值,但最适合您。
答案 2 :(得分:0)
您可以检查传递的参数是否为null
,如果是,则只需返回原始字段的值即可。使用coalesce
是实现这一目标的相对优雅的方法:
UPDATE dbo.users
SET dbo.users.username = COALESCE(@username, dbo.users.username),
dbo.users.password = COALESCE(@password, dbo.users.passoerd),
dbo.users.mail = COALESCE(@mail, dbo.user.mail)
WHERE dbo.users.ID = @ID
答案 3 :(得分:0)
您正在重建UPDATE
。不用理会这个功能。毫无意义。只需直接使用UPDATE
。
要阻止某人修改ID
列,您可以block updates to it specifically:
DENY UPDATE ON dbo.Person (Age, Salary) TO SampleRole;