Ошибка преобразования DateTime при выполнении хранимой процедуры SQL - PullRequest
2 голосов
/ 17 августа 2011

Я написал следующую хранимую процедуру:

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, он работает отлично.

Ответы [ 2 ]

3 голосов
/ 17 августа 2011

Вам нужно CONVERT , конечно, чтобы отформатировать его

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

Зачем SQL Server предположить , что вы хотите объединить разные типы данных?

Ошибка в том, что NVARCHAR (MAX) имеет более низкий приоритет, чем datetime согласно этим правилам

2 голосов
/ 17 августа 2011

Я бы предпочел сделать это - сэкономит много грязных преобразований и красных / черных разрывов (хотя я все еще собираюсь рекомендовать объединение для списка идентификаторов, разделенных запятыми):

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;
...