Sql server 2008 在动态sql中传递日期参数
在我决定按日期范围获取报告之前,该过程一直运行良好。 表中的CreatedDate列的数据类型为datetime。我将c中的日期作为文本传递,例如:“2014-09-31”。参数有时也可以为空 现在我没有得到任何结果。我还尝试将其转换为varchar而不是date。我哪里做错了 如果我只是删除“添加”部分,查询又可以正常工作了Sql server 2008 在动态sql中传递日期参数,sql-server-2008,stored-procedures,dynamic-sql,Sql Server 2008,Stored Procedures,Dynamic Sql,在我决定按日期范围获取报告之前,该过程一直运行良好。 表中的CreatedDate列的数据类型为datetime。我将c中的日期作为文本传递,例如:“2014-09-31”。参数有时也可以为空 现在我没有得到任何结果。我还尝试将其转换为varchar而不是date。我哪里做错了 如果我只是删除“添加”部分,查询又可以正常工作了 ALTER PROCEDURE GetReport ( @StartDate varchar(10), @EndDate varchar(10) ) AS BEGIN
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
如果列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) )
为什么需要动态查询?您确实应该使用datetime数据类型而不是字符串。