gpt4 book ai didi

sql-server - 在动态 SQL 中将 varchar 转换为日期时间

转载 作者:行者123 更新时间:2023-12-02 03:53:30 26 4
gpt4 key购买 nike

我不断收到以下错误:

Msg 241, Level 16, State 1, Line 9 Conversion failed when converting datetime from character string.

这是我要执行的代码:

  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 中,您试图将日期时间变量添加到文本字符串,这导致 SQL 尝试将文本字符串转换为日期时间值(按照转换的优先顺序)。您还需要将变量设置为 nvarchar,以避免在原始动态 SQL 中进行转换。

关于sql-server - 在动态 SQL 中将 varchar 转换为日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13589779/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com