为什么Set Command为空

时间:2010-04-29 12:28:12

标签: sql-server

我是T-SQL的新手,想知道为什么以下工作并且不会引发错误:

我有:

DECLARE @aVARCHAR(200), @b VARCHAR(100) 
SET @a = (Some complicated SELECT Statement) 
SET @b = 'ALTER TABLE abc DROP CONSTRAINT ' + @a; <-------- expected it to contain string.
Exec(@b);

第一个集合有一个复杂的select语句,它返回NO行。

然后我希望@b有字符串'ALTER TABLE abc DROP CONSTRAINT'但是在调试时它是空的。这是我发现令人困惑的事情。为什么会这样?

我正在使用SQL Server Express 2008。

3 个答案:

答案 0 :(得分:4)

如果@a为null,则连接到它的任何内容也将为null。做点什么

isnull(@a,'') + 'rest of the string'

答案 1 :(得分:2)

有一些问题:

1)@a出现为null,因此@b赋值没有按预期工作。在尝试使用它并执行@b之前,先对@a进行验证检查。至于为什么它是空白的,请确保您的复杂查询位正确。

2)@b需要大于@a以确保它可以保存ALTER TABLE命令以及进入@a的任何内容。目前你的@b只有@a的一半。

答案 2 :(得分:2)

每当连接字符串时,必须防止空值,因为无论何时将字符串与null连接起来,结果字符串都为null:

DECLARE @NullValue varchar(5)
SET @NullValue=null  --not necessary but to make the point
SELECT 'Hello World'+@NullValue

输出:

------------
NULL

(1 row(s) affected)

防止空值:

DECLARE @NullValue varchar(5)
SET @NullValue=null  --not necessary but to make the point
SELECT 'Hello World'+ISNULL(@NullValue,'')

输出:

------------
Hello World

(1 row(s) affected)

另一个例子:

SELECT 'Hello World'+@YourValueHere

会显示什么?谁知道,如果@YourValueHere是NULL,那么什么都没有。使用它来确保你得到你想要的东西:

SELECT 'Hello World'+ISNULL(@YourValueHere,'')