我得到了以下错误
从字符串转换日期和/或时间时,
转换失败
我无法让它正常运行,请帮助我,这是我的代码(不要羞辱我的循环,我只是需要它来工作)。
问题是,我有一个包含契约it的封闭列表和一个具有不同日期和日期的表,名为#PERIODO,它包含datetime类型。
WHILE (SELECT TOP 1 FECHA1 FROM #PERIODO) > 0
BEGIN
SET @MES_ANTERIOR = (SELECT TOP 1 FECHA1 FROM #PERIODO ORDER BY FECHA1 ASC)
SET @MES_EN_CURSO = (SELECT TOP 1 B.FECHA1 FROM (SELECT TOP 2 A.FECHA1 FROM #PERIODO A ORDER BY FECHA1 ASC ) B ORDER BY B.FECHA1 DESC)
SET @MES_3 = (SELECT TOP 1 FECHA3 FROM #PERIODO ORDER BY FECHA1 ASC)
SET @MES_4 = (SELECT TOP 1 B.FECHA3 FROM (SELECT TOP 2 A.FECHA3 FROM #PERIODO A ORDER BY FECHA3 ASC ) B ORDER BY B.FECHA3 DESC)
SET @MES_ANT = LEFT(CONVERT(VARCHAR(8),@MES_ANTERIOR,112),8) -- SELECT @MES_ANT
SET @MES_CURR = LEFT(CONVERT(VARCHAR(8),@MES_EN_CURSO,112),8) -- SELECT @MES_CURR
EXEC('IF OBJECT_ID(''WORK.DBO.OPERACIONES_ABIF_'+@MES_CURR+''', ''U'') IS NOT NULL
DROP TABLE WORK.DBO.OPERACIONES_ABIF_'+@MES_CURR+' ')
SET @SQL1 = 'SELECT DISTINCT
A.*
INTO WORK.DBO.OPERACIONES_ABIF_'+@MES_CURR+'
FROM BDGESTION.DBO.BASE_RIESGOS_PROD_ALTAIR_'+@MES_CURR+' A WHERE '
SET @SQL2 = ' A.NUM_OPERACION IN (
SELECT
B.NUM_CONTRATO
FROM (
SELECT NUM_CONTRATO
FROM
( SELECT * FROM #OPER WHERE FECHA_INICIO IS NOT NULL) H
WHERE H.FECHA_INICIO < CAST(CONVERT(VARCHAR(12),'+@MES_EN_CURSO+',23) AS VARCHAR )
AND H.FECHA_INICIO >= CAST(CONVERT(VARCHAR(12),'+@MES_ANTERIOR+',23) AS VARCHAR )
) B
WHERE
B.NUM_CONTRATO IS NOT NULL ) '
EXEC (@SQL1 + @SQL2)
DELETE FROM #PERIODO
WHERE FECHA1 = @MES_ANTERIOR
END 发布于 2019-10-19 12:52:46
问题似乎在于以下几条线:
WHERE H.FECHA_INICIO < CAST(CONVERT(VARCHAR(12), ' + @MES_EN_CURSO + ', 23) AS VARCHAR) 想必,您希望在聚合之外的cast():
WHERE H.FECHA_INICIO < ' + CONVERT(VARCHAR(12), @MES_EN_CURSO + ', 23) + '但是,我不建议将此作为解决方案。正确的解决方案是将值作为参数传入。您的查询太复杂(而且混乱),我无法尝试。您应该查看有关如何正确使用参数构造动态sp_executesql的文档。
发布于 2019-10-19 03:17:59
我认为您应该在遍历循环时使用print @SQL2,这样就可以看到不正确的值。
向您展示如何使用declare @MES_EN_CURSO和declare @MES_ANTERIOR将是有帮助的。
https://stackoverflow.com/questions/58460176
复制相似问题