我需要更新表格行中的一些列。为此,我编写了一个存储过程,下面是关键代码。我想检查@Title或@Descriptions是否为NULL,在这种情况下更新此数据。这种情况的最佳做法是什么?
UPDATE configuration
SET Title = @Title,
Description = @Description,
ShowHeader = @ShowHeader,
XmlConfiguration = @XmlConfiguration
WHERE Id = @Id
修改
让我们假设Title不为null但描述为null。在这种情况下,我想只更新标题并保存描述而不做任何更改。有可能吗?
答案 0 :(得分:3)
UPDATE configuration
SET Title = @Title,
Description = @Description,
ShowHeader = @ShowHeader,
XmlConfiguration = @XmlConfiguration
WHERE Id = @Id
AND (@Title IS NOT NULL OR @Descriptions IS NOT NULL)
对于新要求:
UPDATE configuration
SET Title = @Title,
Description = ISNULL(@Description,Description),
ShowHeader = ISNULL(@ShowHeader,ShowHeader),
XmlConfiguration = @XmlConfiguration
WHERE Id = @Id
AND (@Title IS NOT NULL OR @Descriptions IS NOT NULL)
答案 1 :(得分:1)
UPDATE configuration
SET Title = ISNULL(@Title,Title),
Description = ISNULL(@Description,Description),
ShowHeader = @ShowHeader,
XmlConfiguration = @XmlConfiguration
WHERE Id = @Id
我想检查标题是否为空,然后更新标题,与描述相同的想法。
如果我理解正确,你只想在传递的值不为null时将title列设置为参数的值,并且与description列的执行方式类似。
以上代码将执行此操作。如果@Title和@Descriptions都为null,则两个相应列中的值不会更改,但其他列仍将更新。如果@Title和@Descriptions都为空,则PM 77-1和Lamak的答案将不会执行任何更新。
请注意,值不会改变;但是,update语句实际上会写入列(即当前值)。在数据完整性方面,这没有区别,但在审计或更改跟踪考虑因素方面可能很重要。
如果您不希望在两个参数都为空时执行更新,则可以添加如下条件:
IF @Title IS NOT NULL OR @Descriptions IS NOT NULL
BEGIN
UPDATE configuration
SET Title = ISNULL(@Title,Title),
Description = ISNULL(@Description,Description),
ShowHeader = @ShowHeader,
XmlConfiguration = @XmlConfiguration
WHERE Id = @Id
END
使用if块将强制服务器首先评估您的两个参数条件。如果将它们放在where子句中,则可能(尽管不太可能)服务器将决定首先检查@Id条件。在@Title和@Descriptions都为空的情况下,上面的代码保存了潜在的索引查找。然而,这至多是一个非常小的节省。
答案 2 :(得分:0)
你也可以尝试这个“技巧”。
如果更新值为null,则使用~inuferred_value。
Use Northwind
GO
declare @City varchar(12)
select @City = null
Update [dbo].[Customers]
Set
[City] = ISNULL(@City, custs.City)
From
[dbo].[Customers] custs
where CustomerID = 'WOLZA'
Select City as MyCity, * from [dbo].[Customers] where CustomerID = 'WOLZA'
select @City = 'WarszawaABC'
Update [dbo].[Customers]
Set
[City] = ISNULL(@City, custs.City)
From
[dbo].[Customers] custs
where CustomerID = 'WOLZA'
Select City as MyCity, * from [dbo].[Customers] where CustomerID = 'WOLZA'