datetime类型的参数不能为NULL的问题
为什么我的存储过程的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
|
作者: 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
作者: 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
推荐阅读
-
解决python写入mysql中datetime类型遇到的问题
-
基于vue 添加axios组件,解决post传参数为null的问题
-
无法确定条件表达式的类型,因为“
”和“System.DateTime”之间没有隐式转换----解决办法 -
如何优雅的使用 参数 is null而不导致全表扫描(破坏索引)
-
解决MyBatis @param注解参数类型错误异常的问题
-
带Boolean类型的参数的接口用postman测试时传参问题
-
带Boolean类型的参数的接口用postman测试时传参问题
-
php foreach 参数强制类型转换的问题
-
Docker之修改/etc/default/docker 里的DOCKER_OPTS参数不生效问题
-
如何在postman里为类型为Edm.DateTime的OData参数指定正确格式的值 postmanSAPSAP云平台SAP Cloud PlatformABAP