【问题标题】:CAST varchar to datetime in dynamic SQL在动态 SQL 中将 varchar 转换为日期时间
【发布时间】:2012-11-27 17:30:54
【问题描述】:

我不断收到以下错误:

Msg 241, Level 16, State 1, Line 9 转换时转换失败 字符串中的日期时间。

这是我要执行的代码:

  DECLARE @v_sql  varchar(max),
  @v_database varchar(25),
  @vStartTime     DATETIME,
  @vEndTime       DATETIME

SELECT @v_database = N'[DATABASE_NAME]', @vStartTime = '2012-09-27', @vEndTime = '2012-11-27'


SELECT @v_sql = N'SELECT
  (SELECT ID FROM DATASTORE.DBO.PLANT WHERE DESCRIPTION = ''Henderson''),
  SEQ, 
  AID, 
  NAME, 
  GRP, 
  AREA, 
  PRIO,
  CASE ITIME WHEN ''-'' THEN NULL ELSE CAST(SUBSTRING(ITIME,1,8) + '' '' + SUBSTRING(ITIME,9,2) + '':'' + SUBSTRING(ITIME,11,2) + '':'' + SUBSTRING(ITIME,13,2) AS DATETIME) END ITIME,
  CASE ATIME WHEN ''-'' THEN NULL ELSE CAST(SUBSTRING(ATIME,1,8) + '' '' + SUBSTRING(ATIME,9,2) + '':'' + SUBSTRING(ATIME,11,2) + '':'' + SUBSTRING(ATIME,13,2) AS DATETIME) END ATIME,
  CASE NTIME WHEN ''-'' THEN NULL ELSE CAST(SUBSTRING(NTIME,1,8) + '' '' + SUBSTRING(NTIME,9,2) + '':'' + SUBSTRING(NTIME,11,2) + '':'' + SUBSTRING(NTIME,13,2) AS DATETIME) END NTIME,
  DUR, 
  MSG,
  VAR1,
  VAR2,
  VAR3,
  VAR4, 
  OPR, 
  USER_COMMENT
FROM ' + @v_database + '.PROD.ALARM
WHERE CAST(substring(ITIME, 1, 4) + ''-'' + substring(ITIME, 5, 2) + ''-'' + substring(ITIME, 7, 2) + '' '' + substring(ITIME,9,2) + '':'' + substring(ITIME,11,2) + '':'' + substring(ITIME,13,2) + substring(ITIME,15,3) AS DATETIME) BETWEEN  ' + @vStartTime +' AND ' + @vEndTime + ' ORDER BY ITIME'
EXEC(@v_sql)

任何帮助都将不胜感激,我正在为一位同事调查这件事,这让我们俩都难过。

编辑更多挖掘,我们能够自己解决它,将参数传递给sp_executesql

declare
  @vSql     NVARCHAR(MAX),
  @vParam    NVARCHAR(MAX),
  @vDatabase       VARCHAR(15)

SET @vParam = '@vStartTime DATETIME, @vEndTime DATETIME'

 SELECT @vSql = '
    SELECT ''
      '+ @vDatabase + ''',
      ITEM_CODE,
      SOURCE,
      DEST,
      TRAN_DT,
      MILL_NAME,
      NULL
    FROM ' + @vDatabase + '.PROD.GRD_LOG
    WHERE TRAN_DT BETWEEN @vStartTime AND @vEndTime'

EXEC sp_executesql @vSql, @vParam, @vStartTime, @vEndTime

通过创建变量NVARCHAR(MAX),然后使用sp_executesql 而不是仅仅执行@vSql 变量,我们能够解决我们的问题。

感谢任何可能对此进行调查的人。

【问题讨论】:

    标签: sql-server datetime casting dynamic-sql


    【解决方案1】:

    在您的原始动态 SQL 中,您尝试将 datetime 变量添加到文本字符串,这导致 SQL 尝试将文本字符串转换为 datetime 值(按转换的优先顺序)。您还需要将变量设置为 nvarchar 以避免在原始动态 SQL 中转换。

    【讨论】:

      猜你喜欢
      • 2019-08-15
      • 2019-03-13
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      相关资源
      最近更新 更多