欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

datetime类型的参数不能为NULL的问题

程序员文章站 2022-06-02 13:16:40
...

为什么我的存储过程的datetime类型的参数不能为NULL?

来源:https://www.phpfans.net/ask/quiz1/6390981060.html

我的存储过程传空字符串没问题,但是传NULL值时就运行不出结果。
存储过程如下:
SQL code

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 '[email protected]_CHAR+CONVERT(nvarchar,@BeginTime)[email protected]_CHAR+' and '
            if ISNULL(@EndTime,'')<>''
            begin
                set @[email protected][email protected]_CHAR+Convert(nvarchar,@EndTime)[email protected]_CHAR+'and CounselTime between '[email protected]_CHAR+CONVERT(nvarchar,@StartTime)[email protected]_CHAR+' and '
            end
            else
                set @[email protected][email protected]_CHAR+Convert(nvarchar,GETDATE())[email protected]_CHAR+' and CounselTime between '[email protected]_CHAR+CONVERT(nvarchar,@StartTime)[email protected]_CHAR+' and '
            
            if ISNULL(@LastTime,'')<>''
            begin
                set @[email protected][email protected]_CHAR+Convert(nvarchar,@EndTime)[email protected]_CHAR
            end
            else
                set @[email protected][email protected]_CHAR+Convert(nvarchar,GETDATE())[email protected]_CHAR
PRINT(@SQL)
执行存储过程:
EXEC    [YK_PublicCase_Search]
        @StartTime = '',
        @LastTime = '',
        @BeginTime = '',
        @EndTime = ''


这样能PRINT出SQL 语句
但是当传进空值时
SQL code

EXEC    [YK_PublicCase_Search]
        @StartTime =NULL,
        @LastTime = NULL,
        @BeginTime = NULL,
        @EndTime = NULL


这样却PRINT 不出结果。。。
顺便问一下,SQL如何调试存储过程啊?
最好能给提供个****。。。多谢!!!

作者: zaocha321   发布时间: 2010-08-20

SQL code

if ISNULL(@EndTime,'')<>''


这句语句已经将空值转换为''空字符串了,为什么还是不对啊?

作者: zaocha321   发布时间: 2010-08-20

SQL code

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 '[email protected]_CHAR+CONVERT(nvarchar,@BeginTime)[email protected]_CHAR+' and '

这在加 BeginTime 的时候就出不来啦 因为他是NULL 所以想加还是NULL

作者: wxf163   发布时间: 2010-08-20

该回复于2010-08-20 17:08:01被管理员删除

  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP

#4楼 得分:0回复于:2010-08-20 16:19:15

好多地方有问题,我举一个例子

Convert(nvarchar,@EndTime) 要改成Convert(nvarchar,isnull(@EndTime,''))
不如@sql + null它结果就是null,所以输不出结果。

作者: JiaYuHuXiao2010   发布时间: 2010-08-20

也就是说

SQL code

if ISNULL(@EndTime,'')<>''
            begin
                set @[email protected][email protected]_CHAR+Convert(nvarchar,@EndTime)[email protected]_CHAR+'and CounselTime between '[email protected]_CHAR+CONVERT(nvarchar,@StartTime)[email protected]_CHAR+' and '
            end
            else
                set @[email protected][email protected]_CHAR+Convert(nvarchar,GETDATE())[email protected]_CHAR+' and CounselTime between '[email protected]_CHAR+CONVERT(nvarchar,@StartTime)[email protected]_CHAR+' and '
            
            if ISNULL(@LastTime,'')<>''
            begin
                set @[email protected][email protected]_CHAR+Convert(nvarchar,@EndTime)[email protected]_CHAR
            end
            else
                set @[email protected][email protected]_CHAR+Convert(nvarchar,GETDATE())[email protected]_CHAR



这些地方涉及到和@sql进行连接的变量都要进过isnull函数的处理。

作者: hao1hao2hao3   发布时间: 2010-08-20

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

作者: hao1hao2hao3   发布时间: 2010-08-20

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

作者: SQLCenter   发布时间: 2010-08-20

引用 4 楼 hao1hao2hao3 的回复:
好多地方有问题,我举一个例子

Convert(nvarchar,@EndTime) 要改成Convert(nvarchar,isnull(@EndTime,''))
不如@sql + null它结果就是null,所以输不出结果。


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

作者: hao1hao2hao3   发布时间: 2010-08-20

帮你简化它,要习惯不使用@V_CHA代替点,用@V_CHA可读性很差。
你吃不准的地方宁可用cha(39)或quotename()

SQL code

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

作者: zaocha321   发布时间: 2010-08-20

膜拜datetime类型的参数不能为NULL的问题转存失败重新上传取消
小弟佩服的五体投地。。。。

作者: SQLCenter   发布时间: 2010-08-20

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

作者: zaocha321   发布时间: 2010-08-20

引用 8 楼 zaocha321 的回复:
引用 4 楼 hao1hao2hao3 的回复:
好多地方有问题,我举一个例子

Convert(nvarchar,@EndTime) 要改成Convert(nvarchar,isnull(@EndTime,''))
不如@sql + null它结果就是null,所以输不出结果。

if ISNULL(@EndTime,'')<>''
我在开始的地方判断了@EndTime为空的话则给……



那就请你执行下面的语句看看效果,看你这样设置是否在后面有效

SQL code

declare @a varchar(20)
set @a = null
select isnull(@a,'1')
select @a


前一条查询的结果是
1

后一条查询的结果是
NULL

怎么样?想到了什么没有?

作者: lchy110   发布时间: 2010-08-20