如果我只需要更新一列,我是否必须给另一列以前的值,或者我可以给我需要更改的列,而不是空值以更新数据库中的值..这是过程代码,我该怎么办进行此操作,以便我只需要插入要更新的值即可...
ALTER procedure [dbo].[Customer_update]
( @Id int,
@Firstname nvarchar(40)=,
@Lastname nvarchar(40)=,
@City nvarchar(40)=null,
@Country nvarchar(40)=null,
@Phone nvarchar(20)=null
)
as
begin
update Customer set FirstName=@Firstname,LastName=@Lastname,City=@City,Country=@Country,Phone=@Phone where Id=@Id
end
答案 0 :(得分:1)
您几乎拥有了它,正如Alex K在上面的评论中指出的那样,处理可选更新的最优雅的方法是允许空参数并更新发送的内容。
ALTER PROCEDURE [dbo].[Customer_update]
(@Id INT,
@Firstname NVARCHAR(40) = NULL,
@Lastname NVARCHAR(40) = NULL,
@City NVARCHAR(40) = NULL,
@Country NVARCHAR(40) = NULL,
@Phone NVARCHAR(20) = NULL)
AS
BEGIN
UPDATE Customer
SET FirstName = ISNULL(@Firstname, FirstName)...
WHERE Id = @Id
END
为了在带有可为空字段的客户端代码中使用此字段,只需完全省略该参数或让空值通过(需要注意的是,当您确实需要将该字段设置为null时,在这种情况下该字段可能不应该为null可为空。然后您可以隐式发送一个null,该字段将设置为适当的值)
可空字段使您可以从存储过程调用中省略参数,而仍然执行操作。当您需要进行更改并且不想影响现有应用程序时,这很有用,只要不需要可为空的字段即可。
您是否要在一项操作中插入/更新?
有些人会做“ upserts”。我个人不喜欢对插入/更新执行一项操作。我觉得客户应该已经知道应该执行什么操作,而且一次更新和一个插入过程使该过程更加透明并且更易于自动生成。
但是,如果您要的是那样,那么您将创建一个与以下过程类似的过程:
ALTER PROCEDURE [dbo].[Customer_update]
(@Id INT = NULL,
@Firstname NVARCHAR(40) = NULL,
@Lastname NVARCHAR(40) = NULL
@City NVARCHAR(40) = NULL
@Country NVARCHAR(40) = NULL
@Phone NVARCHAR(20) = NULL)
AS
BEGIN
IF (@Id IS NULL)
BEGIN
INSERT INTO Customer...
SET @ID = @@SCOPE_IDENTITY
END
ELSE BEGIN
UPDATE Customer
SET FirtName = ISNULL(@FirstName, FirstName)
WHERE Id = @Id
END
SELECT *
FROM Customer
WHERE Id = @Id
END
答案 1 :(得分:0)
您需要在每一列上使用ISNULL:
ALTER procedure [dbo].[Customer_update]
( @Id int,
@Firstname nvarchar(40)=,
@Lastname nvarchar(40)=,
@City nvarchar(40)=null,
@Country nvarchar(40)=null,
@Phone nvarchar(20)=null
)
as
begin
update Customer
set FirstName=ISNULL(@Firstname,FirstName),
LastName=ISNULL(@Lastname,LastName),
City=ISNULL(@City,City),
Country=ISNULL(@Country,Country),
Phone=ISNULL(@Phone,Phone)
where Id=@Id
end