【问题标题】:Conversion failed when converting date and/or time from character string dynamic sql从字符串动态 sql 转换日期和/或时间时转换失败
【发布时间】:2013-04-01 03:23:09
【问题描述】:

我正在运行一些动态 SQL,当我手动写入变量时它运行良好,但是一旦我将它们从手动写入的变量更改为实际变量,我就会收到上面的错误.

代码是:

set @query = 'SELECT eng, ' + @colsNull + ' 
        from 
        (
            select eng, [count], cast(weekof as date) weekof
            from dbo.RPT_ENG_WEEK (''1 jan 2013'', ''9 apr 2013'', ''1 jan 2013'', ''9 apr 2013'')
        ) x
        pivot 
        (
            sum([count])
            for weekof in (' + @cols + ')
        ) p '

效果很好,但是一旦我将其更改为

set @query = 'SELECT eng, ' + @colsNull + ' 
        from 
        (
            select eng, [count], cast(weekof as date) weekof
            from dbo.RPT_ENG_WEEK ('+@from+', '+@to+', '+@start+', '+@end+')
        ) x
        pivot 
        (
            sum([count])
            for weekof in (' + @cols + ')
        ) p '

我得到了错误。我也试过了

set @query = 'SELECT eng, ' + @colsNull + ' 
        from 
        (
            select eng, [count], cast(weekof as date) weekof
            from dbo.RPT_ENG_WEEK ((select CONVERT(DATE'+@from+',105)), (select CONVERT(DATE'+@to+',105)), (select CONVERT(DATE'+@start+',105)), (select CONVERT(DATE'+@end+',105)))
        ) x
        pivot 
        (
            sum([count])
            for weekof in (' + @cols + ')
        ) p '

但无济于事!

也试过了

from dbo.RPT_ENG_WEEK ((select CONVERT(DATE'''+@from+''',105)), (select CONVERT(DATE'''+@to+''',105)), (select CONVERT(DATE'''+@start+''',105)), (select CONVERT(DATE'''+@end+''',105)))

from dbo.RPT_ENG_WEEK ('''+@from+''', '''+@to+''', '''+@start+''', '''+@end+''')

【问题讨论】:

  • 我认为这里的单引号不够from dbo.RPT_ENG_WEEK ('+@from+', '+@to+', '+@start+', '+@end+')
  • @Dommer 这不正是我放在中间代码块中的吗?
  • 我现在也尝试过 dbo.RPT_ENG_WEEK ('''+@from+''', '''+@to+''', '''+@start+''', ' ''+@end+''') 但没有快乐!
  • 是的,我是说那位错了。我已经发布了一个应该有帮助的答案(我希望):-)
  • 您传入的日期格式是什么?是1 jan 2013吗?

标签: sql sql-server-2008 dynamic


【解决方案1】:

如果@from 是这样的字符串:1 jan 2013 那么

如果你改变这个位会发生什么:

from dbo.RPT_ENG_WEEK ('+@from+', '+@to+', '+@start+', '+@end+')

到这里:

from dbo.RPT_ENG_WEEK ('''+@from+''', '''+@to+''', '''+@start+''', '''+@end+''')

每个位置三个单引号。

如果@from 是DATETIME,您需要格式为'd mmm yyyy',那么您可以在每个日期尝试此操作:

CONVERT(VARCHAR, @from, 106)

所以整个事情的结局是这样的:

set @query = 'SELECT eng, ' + @colsNull + ' 
        from 
        (
            select eng, [count], cast(weekof as date) weekof
            from dbo.RPT_ENG_WEEK (''' + CONVERT(VARCHAR, @from, 106) + ''', ''' + CONVERT(VARCHAR, @to, 106) + ''', ''' + CONVERT(VARCHAR, @start, 106) + ''')
        ) x
        pivot 
        (
            sum([count])
            for weekof in (' + @cols + ')
        ) p '

【讨论】:

  • 所以 ` 来自 dbo.RPT_ENG_WEEK (CONVERT(VARCHAR,('''+@from+''',106) `等?
  • 太棒了 - 效果很好!忘记了一切都需要在一个字符串中工作!这可能是我一段时间以来对动态 SQL 的最后一次探索......!
猜你喜欢
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多