sql查询不打印

时间:2010-09-24 07:53:53

标签: sql sql-server

我正在尝试运行动态查询,但由于一些奇怪的原因,它没有运行。它甚至不打印。请任何人都可以告诉我为什么下面的动态查询不能打印。

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**

非常感谢

7 个答案:

答案 0 :(得分:9)

您正在将字符串值添加到空值(@CGNEEPK),这会产生NULL。当您打印NULL时,您什么也看不见。您需要改为使用ISNULL(@CGNEEPK, '')

答案 1 :(得分:5)

正如Noel所说,这是因为你试图将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

答案 2 :(得分:2)

更改为

SET @CGNEEPK= '' 

答案 3 :(得分:1)

如果在SQL中将NULL连接到字符串,则整个字符串将为NULL。变化

SET @CGNEEPK= NULL

SET @CGNEEPK= ''

答案 4 :(得分:1)

听起来像@CGNEEPK的空连接问题,因为你将它设置为NULL。 对于他们的所有参数,或者设置为@CGNEEPK =''

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

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

答案 5 :(得分:0)

在出现null问题之后(很多其他人回答),您可能会查看@TYPE变量。这是一个字符串('Mag'),所以你需要围绕该值和其他字符串的引号:

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

答案 6 :(得分:0)

澄清一下,因为看起来太愚蠢了:

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

仅显示此内容:

(2) This is ODD  very.

从(1)开始的整个第一行被省略!