2013-05-29 106 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

好主意。我通常會爲給我提出問題的聲明做一個打印。 –

相關問題