SQL-Server更新列,允许不编辑字段

时间:2018-09-07 15:10:31

标签: sql sql-server stored-procedures

我不想为数据库中的用户提供大量不同的编辑方法,而是只想编写一种方法,既可以处理所有内容,又可以让客户端将字段留空。 如果将该字段留为空白,则不会进行任何编辑,并且该值将保持不变。

到目前为止,我的脚本看起来像这样,但是您可能会猜到,它不起作用:

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

预先感谢

4 个答案:

答案 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;