在变量中创建动态查询

时间:2014-03-10 12:06:46

标签: sql-server database sql-server-2008 sql-server-2005

我在sql server 2005存储过程中创建一个动态查询,如果是,我收到错误 日期被发送为空/ null到存储过程:

This input parameter cannot be converted

那么,如何检入仅隐藏id日期的存储过程不为空: 下面是我的查询。我在if条件中检查了null,但是它也显示错误

If @startDate IS NOT NULL AND @endDate is Not null
    Begin    
       set @strCondition = ' FO.Rf_Date  >= convert(datetime, ''' + Convert(varchar,@startDate,112) + ''') and  FO.Rf_Date<= convert(datetime, ''' + Convert(varchar,@endDate,112) + ''')'
    End  

2 个答案:

答案 0 :(得分:1)

如果它们可以为空 null,则还需要排除空变量,例如

IF NULLIF(@startDate, '') IS NOT NULL AND NULLIF(@endDate, '') IS NOT NULL

答案 1 :(得分:1)

你也可以使用ISDATE()函数以及类似这样的CASE语句。

SET @strCondition = N' SELECT * FROM TableName WHERE 1 = 1 '     --<-- 1 = 1 so you can append any more line starting with 'AND'
                   + CASE WHEN ISDATE(NULLIF(@startDate,'')) = 1  
                           THEN   N' AND FO.Rf_Date  >= convert(datetime, ''' + Convert(varchar,@startDate,112) + ''') '
                          ELSE N'' END
                   + CASE WHEN ISDATE(NULLIF(@endDate,'')) = 1                        
                           THEN  N' AND  FO.Rf_Date  <= convert(datetime, ''' + Convert(varchar,@endDate,112) + ''')'
                          ELSE N'' END 

注意

如果传递的参数不是日期值,则ISDATE()函数返回0,它也返回0,传递的值为NULL。