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