为什么Select语句没有分配空字符串或null值,如果它没有返回结果?

时间:2015-12-03 03:01:13

标签: sql sql-server

我有以下代码:

declare @testValue nvarchar(50) = 'TEST';

select @testValue = 'NOTUSED' where 1 > 2;
select @testValue; -- Outputs 'TEST'
select @testValue = 'USED' where 2 > 1;
select @testValue; -- Outputs 'USED'

使用上述内容,从不使用第一个赋值,因为where子句失败。第二个正确完成并返回使用。

为什么SQL在这种情况下不返回null,并在第一次赋值失败后为@testValue分配一个NULL值?

4 个答案:

答案 0 :(得分:2)

这是预期的行为:

“如果SELECT语句没有返回任何行,则该变量将保留其当前值。如果expression是一个不返回值的标量子查询,则该变量将设置为NULL。”

https://msdn.microsoft.com/en-us/library/ms187330.aspx

您可以在示例中使用右侧的子查询来解决此问题。

SELECT @testValue = (SELECT 'NOTUSED' where 1 > 2);

至于为什么会这样,我不能肯定地说。也许整个@testValue = 'NOTUSED'等于NULL而不仅仅是语句的右侧'NOTUSED'部分,这可以防止设置参数。没有直接相关,但我可以说,当涉及NULL时,我花了一些时间来编写查询。您需要了解/熟悉ANSI NULL规范和相关行为。

答案 1 :(得分:0)

这是SELECT的默认行为。

使用SELECT为变量赋值时,如果没有返回值,SELECT将根本不进行赋值,因此变量的值不会更改。

另一方面,如果没有返回值,SET会将NULL分配给变量。

For more info

答案 2 :(得分:0)

glob-expand-word是你想要的理想值,但SQL引擎不够聪明,因为其他一些人可能想要空字符串,''在那种情况下或0或1,你看。因此,没有设置单个默认值。 Best设置您自己的默认值。你可以在下面看到

NULL

答案 3 :(得分:0)

SQL中的

NULL用于表示缺失数据或未知值。在这种情况下,数据不会丢失,@ testValue的值是已知的,它只是失败了赋值条件,因此它没有获得新值。

如果您要将初始分配更改为此

declare @testValue nvarchar(50)

你会得到如下的NULL:

select @testValue = 'NOTUSED' where 1 > 2;
select @testValue; -- Outputs NULL
select @testValue = 'USED' where 2 > 1;
select @testValue; -- Outputs 'USED'

不要因为你的例子中没有NULL而感到失望。 NULL并不容易处理。

例如,您无法比较两个NULL值,因为NULL的实例不相等。因此,您还需要使用ISNULL之类的特殊运算符来检查它。

一般来说,我认为应该避免使用NULL作为编程结构。这是编程语言中的一些争论领域。但是,即使是null Tony Hoare的创造者,也可以将其称为null,这就是将他的“十亿美元”错误称为“无效”。

相关问题