2013-05-29 108 views
2

我正在用这个返回错误的查询挣扎:当从字符串转换日期和/或时间时,转换失败。当从字符串中转换日期和/或时间时,转换失败

这是从我的谷歌搜索判断的一个常见错误,但我迄今为止没有尝试过。我已经尝试将@startdate作为datetime和varchar并单独放置,如下例所示。

我也尝试使用转换字段名和参数名称,虽然承认,我可能只是得到的语法错误。

ALTER PROCEDURE [dbo].[customFormReport] 
(
    @formid int, 
    @startdate DATETIME 
) 
AS 
BEGIN 
SET NOCOUNT ON 

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(fieldname) from FormResponse WHERE FormID = @formid AND value IS NOT NULL FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT FormID, FormSubmissionID,' + @cols + ' from 
      (
       SELECT FormID, FormSubmissionID, fieldname, value 
       FROM FormResponse WHERE FormID = ' + CAST(@formid AS VARCHAR(25)) + ' AND createDate > ' + @startdate + ' 
      ) x 
      pivot 
      (
       max(value) 
       for fieldname in (' + @cols + ') 
      ) p ' 

execute(@query) 

编辑:查询工作,除了当我添加了位会导致错误:

' AND createDate > ' + @startdate + ' 

回答

6

问题是你试图连接一datetimevarchar SQL字符串。你需要将其转换:

convert(varchar(10), @startdate, 120) 

所以完整的代码将是:

ALTER PROCEDURE [dbo].[customFormReport] 
(
    @formid int, 
    @startdate DATETIME 
) 
AS 
BEGIN 
SET NOCOUNT ON 

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(fieldname) from FormResponse WHERE FormID = @formid AND value IS NOT NULL FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT FormID, FormSubmissionID,' + @cols + ' from 
      (
       SELECT FormID, FormSubmissionID, fieldname, value 
       FROM FormResponse 
       WHERE FormID = ' + CAST(@formid AS VARCHAR(25)) + ' 
        AND createDate > ''' + convert(varchar(10), @startdate, 120) + ''' 
      ) x 
      pivot 
      (
       max(value) 
       for fieldname in (' + @cols + ') 
      ) p ' 

execute(@query) 
+0

这将运行,但结果并不受参数。所有行都会返回,包括那些createDate大于输入日期的行。 我试过将日期的样式从120改为101,因为我输入日期为mm/dd/yyy 感谢您的帮助。 – tintyethan

+1

@EthanPelton不是执行查询,而是尝试打印查询字符串并单独执行。你会得到正确的结果吗?您提交的@ startdate的值是多少?什么格式? – Taryn

+0

大声笑!灿烂的蓝色!谢谢。 我不得不添加转义单qoutes ... CREATEDATE> '' '+转换(VARCHAR(10),@startdate 1,120)+ ''' – tintyethan

0

如果动态生成SQL语句,日期值必须被包裹在单引号。每当构建动态语句时,请执行SELECT @query并确保结果看起来正确。

对于你的榜样,你就需要有'WHERE createdate > ''' + covert(varchar(10), @startdate, 111) + '''

这将输出:WHERE createdate > '2013/05/29'

没有单引号,你将有:WHERE createdate > 2013/05/29

+0

更好的是,添加一个可选的指示调试模式的BIT参数。然后你可以检查'IF @ Debug = 1'并打印你的@query。如果你选择了一堆动态查询,你的屏幕会变得很乱。 – rbedger

+0

好主意。我通常会为给我提出问题的声明做一个打印。 –

相关问题