2011-08-17 5 views
2

je l'ai écrit en suivant la procédure stockée:Conversion erreur DateTime lors de l'exécution procédure stockée 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 

Maintenant, lorsque je tente d'exécuter cette SP en utilisant toute la manière suivante:

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'} 

i get suivantes erreur:

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

toute suggestion pourquoi me donne une erreur. Et si seulement exécuter la requête Select, il fonctionne parfaitement bien.

+0

obtenir toujours la même erreur ... –

+0

Jetez un coup d'réponse de GBN - cela aide quelque chose? –

+0

@marc_s yup La réponse de gbn est correcte ... –

Répondre

3

Vous avez besoin CONVERT bien sûr le formater

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

Pourquoi SQL Server suppose que vous voulez concaténer différents types de données?

L'erreur est parce que NVARCHAR (MAX) est plus faible priorité alors datetime selon these rules

+0

merci ... et encore une chose non seulement les dates de conversion nécessaires mais le @type doit aussi être casté ---> AND [Type] = '+ CAST (@ tapez AS CHAR (1)) + ' merci –

+0

@dvlpr: oui, pour la même raison. – gbn

2

Je préférerais le faire - permet d'économiser beaucoup de conversions en désordre et les pauses rouge/noir (bien que je vais quand même recommander concaténation pour la liste séparée par des virgules des 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; 
+0

yup c'est bon dans un sens ... mais vous devez le faire tout le temps dans votre code lors de l'appel ce SP –

+0

Je ne suis pas sûr de ce que vous voulez dire. Ce code va dans votre procédure stockée, en remplaçant les 'SET' et' EXECUTE() 'vous avez là maintenant. Vous pourrez continuer à appeler votre procédure stockée exactement de la même manière. Je ne pensais pas qu'il était nécessaire de répéter tous les autres codes dans votre procédure stockée, mais je peux le faire si vous en avez besoin. –

+0

ohh désolé ... mal comprendre ... –

Questions connexes