【问题标题】:Passing date parameter in dymanic sql在动态sql中传递日期参数
【发布时间】:2014-09-17 16:33:40
【问题描述】:

在我决定按日期范围获取报告之前,此程序运行良好。 表中的 CreatedDate 列是数据类型 datetime。我将 c# 中的日期作为文本传递,例如:'2014-09-31'。参数有时也可以为空。

现在我没有得到任何结果。我还尝试转换为 varchar 而不是日期。我哪里错了。

如果我只是删除“添加”部分,查询再次正常工作。

ALTER PROCEDURE GetReport
(
 @StartDate varchar(10),
 @EndDate varchar(10)
)
AS
BEGIN
 SET NOCOUNT ON;
     IF (@StartDate = '')
     SET @StartDate = NULL 

     IF (@EndDate = '')
     SET @EndDate = NULL

DECLARE @query VARCHAR(MAX)
DECLARE @questions VARCHAR(MAX)
SELECT @questions = STUFF((....some code)  

SET @query = 'SELECT * FROM
                    (
                      SELECT asq.QuestionText, asa.Comments, 
                             ROW_NUMBER() OVER(PARTITION BY asa.FkQuestionId
                             ORDER BY asa.Comments) Seq
                             FROM Answers AS asa 
                             LEFT JOIN Questions AS asq ON    
                             asa.FkQuestionId = asq.QuestionId

                  //---added this part------
                    WHERE (asa.CreatedDate) >= CONVERT(date,'+@StartDate+') 
                    OR CONVERT(date,'+@StartDate+') IS NULL)
                    AND (asa.CreatedDate) <= CONVERT(date,'+@EndDate+') OR 
                    CONVERT(date,'+@EndDate+') IS NULL)
                 //---end------

                     ) AS t    
                     PIVOT
                        (
                          MIN(t.Comments)    
                          FOR t.QuestionText IN ('+@questions+')    
                        ) AS pvt'                       
            EXECUTE (@query)
END

【问题讨论】:

  • 为什么需要动态查询??
  • 你真的应该使用日期时间数据类型而不是字符串。

标签: sql-server-2008 stored-procedures dynamic-sql


【解决方案1】:

如果您的列 CreatedDate 是数据类型 datetime,那么您需要转换为 date 以删除时间部分。时间部分可能不是 00:00:00

                WHERE ( CAST(asa.CreatedDate AS DATE) >= CONVERT(date,'+@StartDate+') 
                OR CONVERT(date,'+@StartDate+') IS NULL) )
                AND ( CAST(asa.CreatedDate AS DATE) <= CONVERT(date,'+@EndDate+') OR 
                CONVERT(date,'+@EndDate+') IS NULL) )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    相关资源
    最近更新 更多