2009-07-05 9 views
0

Lorsque j'essaie d'exécuter cette instruction SQL, j'obtiens l'erreur. La conversion a échoué lors de la conversion de la chaîne de caractères en type de données smalldatetime.Impossible d'injecter smalldatetime dans l'instruction D-SQL

Est-ce que quelqu'un sait ce que je fais mal?

declare @modality varchar(50) 
declare @datefrom smalldatetime 

set @modality = 'xxxxxxx' 
set @datefrom = '20090101' 

declare @var1 nvarchar(4000) 
select @var1 = 
    'select 
     sum('+ @modality +') as ' + dbo.fnc_titlecase(@modality) +' 
    from dbo.vw_RawData 
    where vw.date >= ' + @datefrom + '' 

exec sp_executesql @var1 

Répondre

2

Vous tentez de concaténer la variable smalldatetime avec un varchar. Changer

Solution 1

declare @datefrom smalldatetime 

à

declare @datefrom varchar(8) 

et

select @var1 = 'select sum('+ @modality +') as ' + dbo.fnc_titlecase(@modality) + 
' from dbo.vw_RawData where vw.date >= ' + @datefrom + '' 

à

select @var1 = 'select sum('+ @modality +') as ' + dbo.fnc_titlecase(@modality) + 
' from dbo.vw_RawData where vw.date >= ''' + @datefrom + '''' 

Solution 2

changement

select @var1 = 'select sum('+ @modality +') as ' + dbo.fnc_titlecase(@modality) + 
' from dbo.vw_RawData where vw.date >= ' + @datefrom + '' 

à

select @var1 = 'select sum('+ @modality +') as ' + dbo.fnc_titlecase(@modality) + 
' from dbo.vw_RawData where vw.date >= ''' + convert(varchar(10), @datefrom, 121) + '''' 
1

Dans l'instruction select @var1 = 'select sum('+ @modality +') as ' + dbo.fnc_titlecase(@modality) +' from dbo.vw_RawData where vw.date >= ' + @datefrom + '' SQL Server essaie de faire des calculs de dates par coulée toutes les cordes entourant un smalldatetime au lieu de convertir @datefrom en chaîne et effectuer une concaténation de chaîne.

Correctifs possibles.

  • Remplacez @DateFrom par une piqûre de sorte que la concaténation fonctionne. Notez que devra ajouter quelques guillemets afin que la chaîne dans @ Var1 soit correctement .
  • Utilisez la fonction de conversion pour convertir @datefrom en chaîne. Recherchez le bon numéro de conversion dans les livres en ligne. Je n'ai pas le temps de le faire maintenant. Ne pas utiliser cast, il ne donnera pas
  • Utilisez une chaîne SQL paramétrée. Recherchez sp_executesql dans la documentation en ligne. (Ou attendre, StackOverflow a toujours quelqu'un pour signaler comment éviter SQL dynamique.)

EDIT: viens de vérifier. cast (@DateTime en tant que Varchar (...)) donne une chaîne que je pensais être difficile à analyser, mais cela semble fonctionner, peut-être essayer plutôt que convertir. Assurez-vous que le varchar() est assez grand

Questions connexes