当我尝试执行此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
答案 0 :(得分: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) + ''''
答案 1 :(得分:1)
在语句select @var1 = 'select sum('+ @modality +') as ' + dbo.fnc_titlecase(@modality) +' from dbo.vw_RawData where vw.date >= ' + @datefrom + ''
中,SQL Server试图通过将所有周围的字符串转换为smalldatetime而不是将@datefrom转换为字符串并执行字符串连接来进行日期算术。
可能的修复。
编辑:刚检查过。 cast(@DateTime as Varchar(...))给出了一个我认为可能难以解析的字符串,但它似乎有用,可能会尝试而不是转换。确保varchar()足够大