我的存储过程传空字符串没问题,但是传NULL值时就运行不出结果。
存储过程如下:
ALTER PROCEDURE [dbo].[YK_PublicCase_Search]
@StartTime datetime,--开始咨询日期
@LastTime datetime,--最后咨询时间
@BeginTime datetime,--开始来访时间
@EndTime datetime--结束来访时间AS
BEGIN
declare @SQL NVARCHAR(MAX),
@V_CHAR NVARCHAR(20),
@Status nvarchar(20)
set @V_CHAR=''''
set @V_CHAR=SUBSTRING(@V_CHAR,1,1)
set @SQL='with t_Temporary as (SELECT ROW_NUMBER() OVER(ORDER BY ID desc)AS ROW,[ID],[CaseName],[CaseState],[CaseSource],[IsContract],[Inputer],[InputTime] 
from [YK_PublicCase] 
where ReceptionTime between '+@V_CHAR+CONVERT(nvarchar,@BeginTime)+@V_CHAR+' and '
if ISNULL(@EndTime,'')<>''
begin
set @SQL=@SQL+@V_CHAR+Convert(nvarchar,@EndTime)+@V_CHAR+'and CounselTime between '+@V_CHAR+CONVERT(nvarchar,@StartTime)+@V_CHAR+' and '
end
else
set @SQL=@SQL+@V_CHAR+Convert(nvarchar,GETDATE())+@V_CHAR+' and CounselTime between '+@V_CHAR+CONVERT(nvarchar,@StartTime)+@V_CHAR+' and '

if ISNULL(@LastTime,'')<>''
begin
set @SQL=@SQL+@V_CHAR+Convert(nvarchar,@EndTime)+@V_CHAR
end
else
set @SQL=@SQL+@V_CHAR+Convert(nvarchar,GETDATE())+@V_CHAR
PRINT(@SQL)
执行存储过程:
EXEC [YK_PublicCase_Search]
@StartTime = '',
@LastTime = '',
@BeginTime = '',
@EndTime = ''这样能PRINT出SQL 语句
但是当传进空值时EXEC [YK_PublicCase_Search]
@StartTime =NULL,
@LastTime = NULL,
@BeginTime = NULL,
@EndTime = NULL这样却PRINT 不出结果
顺便问一下,SQL如何调试存储过程啊?
最好能给提供个视频教程多谢!!!

解决方案 »

  1.   

    if ISNULL(@EndTime,'')<>''这句语句已经将空值转换为''空字符串了,为什么还是不对啊?
      

  2.   

    declare @SQL NVARCHAR(MAX),
            @V_CHAR NVARCHAR(20),
            @Status nvarchar(20)
            set @V_CHAR=''''
            set @V_CHAR=SUBSTRING(@V_CHAR,1,1)
            set @SQL='with t_Temporary as (SELECT ROW_NUMBER() OVER(ORDER BY ID desc)AS ROW,[ID],[CaseName],[CaseState],[CaseSource],[IsContract],[Inputer],[InputTime] 
            from [YK_PublicCase] 
            where ReceptionTime between '+@V_CHAR+CONVERT(nvarchar,@BeginTime)+@V_CHAR+' and '
     这在加 BeginTime 的时候就出不来啦 因为他是NULL 所以想加还是NULL
      

  3.   

    好多地方有问题,我举一个例子Convert(nvarchar,@EndTime)  要改成Convert(nvarchar,isnull(@EndTime,''))
    不如@sql + null它结果就是null,所以输不出结果。
      

  4.   

    也就是说
    if ISNULL(@EndTime,'')<>''
                begin
                    set @SQL=@SQL+@V_CHAR+Convert(nvarchar,@EndTime)+@V_CHAR+'and CounselTime between '+@V_CHAR+CONVERT(nvarchar,@StartTime)+@V_CHAR+' and '
                end
                else
                    set @SQL=@SQL+@V_CHAR+Convert(nvarchar,GETDATE())+@V_CHAR+' and CounselTime between '+@V_CHAR+CONVERT(nvarchar,@StartTime)+@V_CHAR+' and '
                
                if ISNULL(@LastTime,'')<>''
                begin
                    set @SQL=@SQL+@V_CHAR+Convert(nvarchar,@EndTime)+@V_CHAR
                end
                else
                    set @SQL=@SQL+@V_CHAR+Convert(nvarchar,GETDATE())+@V_CHAR这些地方涉及到和@sql进行连接的变量都要进过isnull函数的处理。
      

  5.   

    @StartTime = ''
    相当于
    @StartTime = 1900-01-01 00:00:00.000
      

  6.   

    转换(convert)的时候不用指定长度吗?nvarchar,这样好像会长度默认为1的吧?
      

  7.   

    if ISNULL(@EndTime,'')<>''
    我在开始的地方判断了@EndTime为空的话则给它变成''(空字符串)为什么在Convert()时还是要Convert(nvarchar,isnull(@EndTime,'')) (如果@EndTime为NULL则转换为'')
      

  8.   

    帮你简化它,要习惯不使用@V_CHA代替点,用@V_CHA可读性很差。
    你吃不准的地方宁可用cha(39)或quotename()ALTER PROCEDURE [dbo].[YK_PublicCase_Search]
    @StartTime datetime,--开始咨询日期
    @LastTime datetime,--最后咨询时间
    @BeginTime datetime,--开始来访时间
    @EndTime datetime--结束来访时间AS
    BEGIN
    declare @SQL NVARCHAR(MAX)
    set @SQL='with t_Temporary as (SELECT ROW_NUMBER() OVER(ORDER BY ID desc)AS ROW,[ID],[CaseName],[CaseState],[CaseSource],[IsContract],[Inputer],[InputTime]'
    + ' from [YK_PublicCase] where 1=1'
    + isnull(' and ReceptionTime>=''' + convert(varchar,@BeginTime,126)+'''', '')
    + isnull(' and ReceptionTime<=''' + convert(varchar,@EndTime,126)+'''', '')
    + isnull(' and CounselTime>=''' + convert(varchar,@StartTime,126)+'''', '')
    + isnull(' and CounselTime<=''' + convert(varchar,@LastTime,126)+'''', '')PRINT(@SQL)
    END
      

  9.   

    你只isnull了两个  但里面一共是四个  那当然会在转换的时候会出错
      

  10.   


    那就请你执行下面的语句看看效果,看你这样设置是否在后面有效
    declare @a varchar(20)
    set @a = null
    select isnull(@a,'1')
    select @a
    前一条查询的结果是
    1后一条查询的结果是
    NULL怎么样?想到了什么没有?
      

  11.   

    多谢指点,isnull(@a,'1') 只是说如果@a如果为NULL则将结果设置为1(并不是将@a的值改为1)
    所以第二句select @a执行的时候结果依然是NULL。