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 试图通过将所有周围的字符串转换为 smalldatetime 来进行日期算术,而不是将 @datefrom 转换为字符串并执行字符串连接。

可能的修复。

  • 将 @DateFrom 更改为一个字符串,以便串联工作。请注意,您必须添加一些引号,以便@Var1 中的字符串格式正确。
  • 使用 convert 函数将 @datefrom 转换为字符串。在在线图书中查找正确的转换数。我现在没时间。不要使用演员表,它不会给出
  • 使用参数化的 SQL 字符串。在联机丛书中查找 sp_executesql。(或者等等,StackOverflow 总是有人指出如何避免动态 SQL。)

编辑:刚刚检查。cast(@DateTime as Varchar(...)) 给出了一个我认为可能难以解析的字符串,但它似乎有效,可能会尝试而不是转换。确保 varchar() 足够大

于 2009-07-05T07:41:31.493 回答