我有以下代码:
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值?
答案 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
分配给变量。
答案 2 :(得分:0)
glob-expand-word
是你想要的理想值,但SQL引擎不够聪明,因为其他一些人可能想要空字符串,''在那种情况下或0或1,你看。因此,没有设置单个默认值。 Best设置您自己的默认值。你可以在下面看到
NULL
答案 3 :(得分:0)
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,这就是将他的“十亿美元”错误称为“无效”。