0

この sql ステートメントを実行しようとすると、エラーが発生します。文字列を smalldatetime データ型に変換するときに変換に失敗しました。

誰かが私が間違っていることを知っていますか?

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
4

2 に答える 2

2

smalldatetime を varchar と連結しようとしています。変化する

解決策 1

declare @datefrom smalldatetime

declare @datefrom varchar(8) 

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

解決策 2

変化する

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) + ''''
于 2009-07-05T07:40:28.110 に答える
1

ステートメントでは、select @var1 = 'select sum('+ @modality +') as ' + dbo.fnc_titlecase(@modality) +' from dbo.vw_RawData where vw.date >= ' + @datefrom + ''SQL Server は、@datefrom を文字列に変換して文字列連結を実行する代わりに、周囲のすべての文字列を smalldatetime にキャストすることによって日付演算を実行しようとしています。

可能な修正。

  • @DateFrom を文字列に変更して、連結が機能するようにします。@Var1 の文字列が適切にフォーマットされるように、いくつかの引用符を追加する必要があることに注意してください。
  • convert 関数を使用して @datefrom を文字列に変換します。Books online で正しい変換番号を調べます。今は時間がありません。キャストを使用しないでください。
  • パラメータ化された SQL 文字列を使用します。オンライン ブックで sp_executesql を検索します。(または、待ってください。StackOverflow には、動的 SQL を回避する方法を指摘する人が常にいます。)

編集:チェックしたところです。cast(@DateTime as Varchar(...)) は、解析が難しいと思われる文字列を返しますが、うまくいくようです。変換する代わりに試してみてください。varchar() が十分な大きさであることを確認してください

于 2009-07-05T07:41:31.493 に答える