我一直收到以下错误:
消息241,级别16,状态1,行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
变量,我们就能够解决问题。
感谢任何可能一直在研究此事的人。
答案 0 :(得分:1)
在原始动态SQL中,您尝试将datetime变量添加到文本字符串,这导致SQL尝试将文本字符串转换为日期时间值(按转换优先顺序)。您还需要将变量设置为nvarchar,以避免在原始动态SQL中进行转换。