2010-09-24 96 views
3

我想運行一個動態查詢,但由於一些奇怪的原因,它沒有運行。它甚至沒有打印。請任何人都可以告訴我爲什麼下面的動態查詢不打印。SQL查詢不打印

DECLARE @CLIENTPK_NEW AS VARCHAR(50) 
DECLARE @CGNEEPK AS VARCHAR(50) 
DECLARE @TYPE AS VARCHAR(10) 

SET @CLIENTPK_NEW='6EF77AAA-1A7B-4D03-A448-D1088DED4134' 
SET @CGNEEPK= NULL 
SET @TYPE='Mag' 

DECLARE @SQL NVARCHAR(MAX)  

SET @SQL = '  
SELECT  
PUBLISHER 
FROM CLIENT_SHIPPINGREPORTDATA_FUNCTION(' 
    + @CLIENTPK_NEW + ' , ' 
    + @CGNEEPK + ' , ' 
    + @TYPE +')' <=== This is the troubled line, but not sure what is error is. 

PRINT @SQL <== **Why is this not priniting** 

非常感謝

+0

這是什麼類型的SQL,SQL Server,MySQL等?你在哪裏運行它? – 2010-09-24 08:02:20

+0

sql server 2005 – Amit 2010-09-24 08:38:38

回答

4

的作爲諾埃爾說,那是因爲你試圖連接一個NULL爲VARCHAR - 最終的結果將是NULL。您還需要將其他varchar值放在單引號中以將它們傳入,這會變得雜亂/有問題。

改爲使用參數化的TSQL。這將允許您輕鬆地將NULL傳遞到您的函數中,並幫助防止SQL注入。

DECLARE @CLIENTPK_NEW AS VARCHAR(50) 
DECLARE @CGNEEPK AS VARCHAR(50) 
DECLARE @TYPE AS VARCHAR(10) 

SET @CLIENTPK_NEW='6EF77AAA-1A7B-4D03-A448-D1088DED4134' 
SET @CGNEEPK= NULL 
SET @TYPE='Mag' 

DECLARE @SQL NVARCHAR(MAX)  

SET @SQL = '  
SELECT  
PUBLISHER 
FROM CLIENT_SHIPPINGREPORTDATA_FUNCTION(
    @CLIENTPK_NEW, @CGNEEPK, @TYPE)' 

-- Then to execute it: 
EXECUTE sp_executesql @SQL, 
    N'@CLIENTPK_NEW VARCHAR(50), @CGNEEPK VARCHAR(50), @TYPE VARCHAR(10)', 
    @CLIENTPK_NEW, @CGNEEPK, @TYPE 
+0

非常感謝。這是一個完美的答案。讚賞 – Amit 2010-09-24 08:56:36

+0

+1 - 使用sp_executesql的良好調用 – Macros 2010-09-24 12:50:06

2

更改爲

SET @CGNEEPK= '' 
9

您要添加字符串值空值(@CGNEEPK),這導致NULL。當你打印NULL時,你什麼都看不到。您需要改用ISNULL(@CGNEEPK, '')

+0

我認爲* @Amit想要通過NULL傳入函數,雖然 – AdaTheDev 2010-09-24 08:06:36

+0

是的,這是正確的,我需要將null傳遞給函數。 – Amit 2010-09-24 08:48:41

1

如果將NULL連接到SQL中的字符串,則整個字符串將爲NULL。更改

SET @CGNEEPK= NULL 

SET @CGNEEPK= '' 
1

聽起來像一個空級聯問題@CGNEEPK作爲其設置爲NULL。 對於所有paramteres爲ISNULL給他們,或者設置@CGNEEPK =「」

SET @SQL = '  
SELECT   
PUBLISHER 
FROM CLIENT_SHIPPINGREPORTDATA_FUNCTION(' 
    + ISNULL(@CLIENTPK_NEW, '') + ' , ' 
    + ISNULL(@CGNEEPK, '') + ' , ' 
    + ISNULL(@TYPE, '') +')' 

PRINT @SQL <== **Why is this not priniting** 
0

在出現null問題(如許多其他人回答)之後,您可能會查看@TYPE變量。這是一個字符串(「彈匣」),所以你需要圍繞該值的報價和其他琴絃:

SET @SQL = '  
SELECT  
PUBLISHER 
FROM CLIENT_SHIPPINGREPORTDATA_FUNCTION(''' 
    + @CLIENTPK_NEW + ''' , ''' 
    + isnull(@CGNEEPK, '') + ''' , ''' 
    + @TYPE +''')' 
0

要澄清,因爲它似乎太愚蠢是真實的:只有

PRINT '(1) This is ODD, ' + NULL +' very.' 
PRINT '(2) This is ODD, ' + ISNULL(NULL,'') +' very.' 

顯示器此:

(2) This is ODD very. 

整個第一線,以(1)中,省略開始!