2010-04-29 81 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的一半。