2011-08-17 297 views
2

時,我已經寫了下面的存儲過程轉換日期時間錯誤:執行SQL存儲過程

GO 
/****** Object: StoredProcedure [dbo].[ReadCounters] Script Date: 08/17/2011 13:43:12 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

-- ReadCounters -- 
ALTER PROCEDURE [dbo].[ReadCounters] 
    @type bit, 
    @startDate DateTime, 
    @endDate DateTime 
AS 
BEGIN 
    DECLARE 
    @AllCounterIds NVARCHAR(MAX), 
    @Query NVARCHAR(MAX); 

    SELECT @AllCounterIds = STUFF((
      SELECT DISTINCT '],[' + CAST([CounterId] AS VARCHAR(32)) 
      FROM AllCounters 
      WHERE [DateTime] > @startDate AND [DateTime] < @endDate AND [Type] = @type 
      for xml path('')), 1, 2, '') + ']'; 

    SET @Query = 'SELECT [DateTime], pvt.* from 
        (SELECT [Type], [DateTime], [Value], [CounterId] 
        FROM AllCounters WHERE CounterId IN 
         (
         SELECT DISTINCT([CounterId]) 
         FROM AllCounters 
         WHERE [DateTime] > '''+ @startDate +''' AND [DateTime] < '''+ @endDate +''' AND [Type] = '+ @type +' 
         ) AND [DateTime] > '''+ @startDate +''' AND [DateTime] < '''+ @endDate +''' AND [Type] = '+ @type +' 
        ) S 
       PIVOT 
       (
        SUM (Value) 
        FOR CounterId IN 
        (' + @AllCounterIds + ') 
       ) AS pvt;';   
    EXECUTE(@Query); 
END 

現在,當我嘗試使用執行該SP以下任一方式:

exec ReadCounters 1,'2013-10-05', '2011-11-30' 
exec ReadCounters 1,'2013-10-05 00:00:00', '2011-11-30 00:00:00' 
exec ReadCounters 1,'2013-10-05 00:00:00.000', '2011-11-30 00:00:00.000' 
exec ReadCounters 1,{ts '2013-10-05 00:00:00.000'}, {ts '2011-11-30 00:00:00.000'} 

我獲得以下錯誤:

Msg 241, Level 16, State 1, Procedure ReadCounters, Line 19 
Conversion failed when converting date and/or time from character string. 

任何建議爲什麼給我錯誤。如果只執行Select查詢,它運行得很好。

+0

仍然得到同樣的錯誤... – 2011-08-17 13:20:18

+0

退房GBN的答案 - 這是否什麼幫助? – 2011-08-17 13:21:32

+0

@marc_s yup gbn的回答是正確的...... – 2011-08-17 13:38:57

回答

3

你當然需要CONVERT對其進行格式化

.... 
WHERE [DateTime] > '''+ CONVERT(varchar(30), @startDate, 120) +''' AND ... 
... 

爲什麼SQL SERVER 猜測你想連接不同的數據類型?

這個錯誤是因爲NVARCHAR(MAX)爲低優先級的日期時間,然後按these rules

2

我寧願做這一點 - 節省了大量凌亂的轉換和紅/黑休息(雖然我仍然會建議串聯爲ID的逗號分隔的列表):

SET @Query = N'SELECT [DateTime], pvt.* from 
      (SELECT [Type], [DateTime], [Value], [CounterId] 
      FROM AllCounters WHERE CounterId IN 
       (
       SELECT DISTINCT([CounterId]) 
       FROM AllCounters 
       WHERE [DateTime] > @startDate AND [DateTime] < @endDate AND [Type] = @type 
       ) AND [DateTime] > @startDate AND [DateTime] < @endDate AND [Type] = @type 
      ) S 
      PIVOT 
      (
       SUM (Value) 
       FOR CounterId IN 
       (' + @AllCounterIds + ') 
      ) AS pvt;';   

EXEC sp_executesql @query, 
    N'@startDate DATETIME, @endDate DATETIME, @type BIT', 
    @startDate, @endDate, @type;