我的存储过程传空字符串没问题,但是传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如何调试存储过程啊?
最好能给提供个视频教程多谢!!!
存储过程如下:
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如何调试存储过程啊?
最好能给提供个视频教程多谢!!!
解决方案 »
- 请求高手帮帮忙!!!!!!!!!!!!!!!!
- 更换成SQL Server 数据库后用户登陆判断问题,请高手帮忙!
- 在命令行里执行sql报错,但在查询分析器里不报错,这是为什么?
- 菜鸟sql语句问题
- **____为什么我在ultraedit中带汉字的存储过程,复制到分析器中就全变乱码了___**
- 两张表:table1(ID0,ID1),table2(ID1,ID0),table1的ID1外键约束于table2,table2的ID0约束于table1,怎么插入数据??
- sql6.5中显示DateTime字段有的机器上是2005 2 1有的是 2005 二月 1?
- sqlserver性能测定
- 动态sql 按日期查询问题
- 通用分页存储过程如何防止SQL注入?高手接分啦,100在线等,急。。。。。
- 存储过程的参数用在 in 中怎么处理
- 只有一个物理磁盘,划分文件组是否可以提高性能
@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
不如@sql + null它结果就是null,所以输不出结果。
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函数的处理。
相当于
@StartTime = 1900-01-01 00:00:00.000
我在开始的地方判断了@EndTime为空的话则给它变成''(空字符串)为什么在Convert()时还是要Convert(nvarchar,isnull(@EndTime,'')) (如果@EndTime为NULL则转换为'')
你吃不准的地方宁可用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
那就请你执行下面的语句看看效果,看你这样设置是否在后面有效
declare @a varchar(20)
set @a = null
select isnull(@a,'1')
select @a
前一条查询的结果是
1后一条查询的结果是
NULL怎么样?想到了什么没有?
所以第二句select @a执行的时候结果依然是NULL。