Sql server 如何在SQL中通过检查NULL来更新行?

Sql server 如何在SQL中通过检查NULL来更新行?,sql-server,tsql,sql-update,Sql Server,Tsql,Sql Update,我需要更新表行中的一些列。为此,我编写了一个存储过程,下面是关键代码。我想检查@Title或@description是否不为NULL,并在本例中更新此数据。对于这种情况,什么是最佳做法 UPDATE configuration SET Title = @Title, Description = @Description, ShowHeader = @ShowHeader, XmlConfiguration = @XmlConfiguration WHERE Id = @

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

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

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

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)
对于新要求:

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)
我想检查title是否不为null,然后更新title,与description的想法相同

如果我理解正确,您希望仅当传递的值不为null时才将title列设置为参数的值,并对description列执行类似的操作

上面的代码将实现这一点。如果@Title和@description都为null,则两个对应列中的值不会更改,但其他列仍将更新。如果@Title和@description都为空,PM 77-1和Lamak的答案将不会执行任何更新

请注意,这些值不会改变;但是,update语句实际上会写入列(即当前值)。就数据完整性而言,这没有什么区别,但对于审计或更改跟踪考虑而言,这可能很重要

如果不希望在两个参数都为null时执行更新,可以添加如下条件:

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和@description都为null时,上述代码保存了一个潜在的索引查找。然而,这充其量只是一个很小的节约

我想检查title是否不为null,然后更新title,与description的想法相同

如果我理解正确,您希望仅当传递的值不为null时才将title列设置为参数的值,并对description列执行类似的操作

上面的代码将实现这一点。如果@Title和@description都为null,则两个对应列中的值不会更改,但其他列仍将更新。如果@Title和@description都为空,PM 77-1和Lamak的答案将不会执行任何更新

请注意,这些值不会改变;但是,update语句实际上会写入列(即当前值)。就数据完整性而言,这没有什么区别,但对于审计或更改跟踪考虑而言,这可能很重要

如果不希望在两个参数都为null时执行更新,可以添加如下条件:

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和@description都为null时,上述代码保存了一个潜在的索引查找。不过,这充其量只是一个很小的节约。

你也可以试试这个“把戏”

如果更新值为空,则使用~original~值

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'
你也可以试试这个“把戏”

如果更新值为空,则使用~original~值

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'

两个值中是否有一个值为
NULL
?@PM77-1在表中,两个变量都不是NULL。但是在存储过程中,我可以输入空值,这将导致错误。我想检查title是否不为null,然后更新title,这与描述中的想法相同。请查看我的答案(以下)与另一个答案略有不同,并让我知道您考虑的逻辑。两个值中的一个是否为
null
?@PM77-1表中的两个变量都不为null。但是在存储过程中,我可以输入空值,这将导致错误。我想检查标题是否不为空,然后更新标题,与描述相同。请查看我的答案(以下)与另一个答案略有不同,并让我知道您想到的逻辑。谢谢!如果标题不为空,但说明为空,该怎么办?在这种情况下,我只想更新标题并保存描述,不做任何更改。可能吗?谢谢,这就是我要找的!谢谢如果标题不为空,但说明为空,该怎么办?在这种情况下,我只想更新标题并保存描述,不做任何更改。可能吗?谢谢,这就是我要找的!