2010-04-29 60 views
2

我是新来的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

回答

2

只要您连接,必须防止空字符串,因为当你连接具有空的字符串,结果字符串为空:

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

输出:

------------ 
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'[email protected] 

什么将显示?谁知道,如果@YourValueHere是NULL,那么什么都不是。用这个来代替,以确保你得到你以后的东西:

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

谢谢你的例子。这是我第一次使用T-SQL,这很有帮助。 – 2010-04-29 16:20:41

4

如果@a为空,则任何级联它也将是无效的。不喜欢

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

2

有一些问题的东西:

1)@a是走出来为空,所以你预期@b分配不工作。在尝试使用它并执行@b之前,对@a进行验证检查。至于为什么它是空白的,请确保你的复杂查询位是正确的。

2)@b需要比@a大,以确保它可以容纳ALTER TABLE命令加上任何进入@a的内容。目前,您的@b只有@a的一半。