如何在SQL中检查NULL更新行?

时间:2013-09-16 18:57:45

标签: sql-server tsql sql-update

我需要更新表格行中的一些列。为此,我编写了一个存储过程,下面是关键代码。我想检查@Title或@Descriptions是否为NULL,在这种情况下更新此数据。这种情况的最佳做法是什么?

UPDATE configuration
SET Title = @Title,
    Description = @Description, 
    ShowHeader = @ShowHeader,
    XmlConfiguration = @XmlConfiguration
WHERE Id = @Id

修改

让我们假设Title不为null但描述为null。在这种情况下,我想只更新标题并保存描述而不做任何更改。有可能吗?

3 个答案:

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