2017-06-05 1 views
1

Je sais que cette question a été posée plusieurs fois, mais les suggestions ne semblent pas fonctionner pour moi. J'ai une procédure stockée de 83 lignes que je dois appeler et y passer une date de début et une date de fin. La procédure fonctionne très bien si je code dur les dates; Cependant, lorsque je tente de passer les dates que les variables que je reçois l'erreur:La procédure stockée SQL Server a échoué lors de la conversion de la date et/ou de l'heure de la chaîne de caractères

Conversion failed when converting date and/or time from character string

J'appelle ma procédure stockée comme suit:

exec dbo.CreateReport @startDate = '10/01/2013', @endDate = '12/31/2013' 

Je crée ma procédure stockée comme suit:

create procedure dbo.CreateReport 
    @startDate smalldatetime = NULL, 
    @endDate smalldatetime = NULL 

le bloc de code où l'erreur se produit:

declare vp_laboraccount_timesheetitem_cursor cursor for 
      select a.laborleveldsc1,a.laborleveldsc2,a.laboracctid, sum(b.durationsecsqty)/3600 as totalhours 
      from vp_laboraccount a, timesheetitem b 
      where a.laboracctid=b.laboracctid and b.eventdtm >=''' + @@startDate + ''' and b.eventdtm <= ''' + @@endDate + ''' and employeeid = @personid 
      group by a.laborleveldsc1,a.laborleveldsc2,a.laboracctid 
      open vp_laboraccount_timesheetitem_cursor 
      fetch next from vp_laboraccount_timesheetitem_cursor into @laborleveldsc1,@laborleveldsc2,@laboracctid,@totalhours 
      while @@fetch_status=0 
      begin 
      --print results 
       select @message = @personid + ',' + @personcstmdatatxt + ',' + @searchfullnm + ',' + @prdohh + ',' + @prjob1 + ',' + @laborleveldsc1 + ',' + @laborleveldsc2 + ',' + @laboracctid + ',' + @totalhours + ',' + @companhiredtm 
       --print @message 
       insert into dbo.tabResults (messages) Values(@message) 
      fetch next from vp_laboraccount_timesheetitem_cursor into @laborleveldsc1,@laborleveldsc2,@laboracctid,@totalhours 
      end 
      close vp_laboraccount_timesheetitem_cursor 
      deallocate vp_laboraccount_timesheetitem_cursor 

La ligne spécifique où l'erreur se produit:

where a.laboracctid=b.laboracctid and b.eventdtm >=''' + @@startDate + ''' and b.eventdtm <= ''' + @@endDate + ''' and employeeid = @personid 

Les deux variables en question sont les @@ startDate et la @@ endDate.

J'ai essayé plusieurs choses, y compris passer mes variables en tant que varchar, ainsi que faire à la fois un converti et un cast sur les variables, mais rien ne semble fonctionner pour moi. J'ai essayé un seul @ et un double @ @ parce que ceux-ci me posent souvent des problèmes. J'ai essayé différents formats de date, mais chaque fois que je reçois une variation du même message d'erreur. Si je code dur mes chaînes de date dans le code cela fonctionne comme prévu, et sans erreurs.

Je pense que je suis très obtus, et la solution sera évidente une fois que quelqu'un me frappera à la tête avec une pelle, mais après une semaine d'essais, je suis prêt à demander de l'aide. Qu'est-ce que je fais de mal, et que dois-je faire pour résoudre ce problème?

Merci.

+1

enlever les guillemets. il suffit d'utiliser eventdtm> = @startDate (même chose pour @endDate). Pas besoin de concaténer lorsque vous n'utilisez pas SQL dynamique ici. Aussi, vous avez seulement besoin d'un seul @. C'est une variable locale. – scsimon

+2

Vous devez également utiliser des jointures de style ANSI-92, elles existent depuis plus de 25 ans maintenant. http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx Et vous devriez utiliser des alias significatifs pour éviter d'incroyables douleurs. http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-table-aliases-like-abc-or-t1-t2-t3.aspx –

Répondre

2

Les seuls formats vraiment sûrs pour date/heure littéraux dans SQL Server, au moins pour datetime et smalldatetime, sont: YYYYMMDD et YYYY-MM-DDThh:mm:ss[.nnn] - Bad habits to kick : mis-handling date/range queries - Aaron Bertrand

Utilisez le @ unique pour votre variable.

exec dbo.CreateReport @startDate='20131001', @endDate='20131231' 

Et votre where clause devrait être comme ceci:

where a.laboracctid=b.laboracctid 
    and b.eventdtm >= @startDate 
    and b.eventdtm <= @endDate 
    and employeeid = @personid 

En outre, vous devez utiliser une bonne joint à la place de l'ancien style des jointures et utiliser des alias significatifs.

+0

Suppression du citations et le concaténateur a travaillé. J'ai essayé des variantes, mais je n'ai jamais essayé de les supprimer complètement. Merci à scsimon et SqlZim pour vos suggestions et votre aide. Je vais également jeter un coup d'œil sur les autres suggestions, car je suis toujours prêt à améliorer mon travail. – user3788019

+0

@ user3788019 Heureux de vous aider! – SqlZim