sql - 从字符串动态 sql 转换日期和/或时间时转换失败

标签 sql sql-server-2008 dynamic

我正在运行一些动态 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 是这样的字符串:1 jan 2013 then

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

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 '

关于sql - 从字符串动态 sql 转换日期和/或时间时转换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15906310/

相关文章:

php - 使用错误页面预防 SQL 注入(inject)

sql - 选择非空列

SQL Server 账单金额分配

c# - TryInvokeMember 和 TryInvoke 之间的区别

r - dplyr 总结动态列

jsf - 动态 UI 包含在 Primefaces 对话框中

php - 如何在 yii2 queryParams 中设置 OR 条件?

sql - 插入语句来自另一个表的一列其余列是值

mysql - PHP/MYSQL 最流行的查询语法

sql - 以编程方式生成 SQL 脚本以在没有 PRIMARY 语句的情况下创建数据库..使用脚本程序