无法将smalldatetime注入D-SQL语句

时间:2009-07-05 07:26:10

标签: sql tsql dynamic-sql smalldatetime

当我尝试执行此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

2 个答案:

答案 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转换为字符串并执行字符串连接来进行日期算术。

可能的修复。

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

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