2010-09-24 57 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)中,省略开始!