SQL Server 2008 R2: преобразование не выполнено при преобразовании даты и / или времени из символьной строки - PullRequest
0 голосов
/ 19 октября 2019

Я получаю следующую ошибку

Не удалось выполнить преобразование при преобразовании даты и / или времени из строки символов

Я не могу заставить его работать должным образом, пожалуйстапомогите мне, вот мой код (не позорьте мой цикл, мне просто нужно, чтобы он работал).

Дело в том, что у меня есть закрытый список с идентификаторами контрактов и таблица с разными датами и датами, называемая #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 

Ответы [ 2 ]

0 голосов
/ 19 октября 2019

Возможно, проблема в следующих строках:

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 о том, как правильно построить динамический SQL с параметрами.

0 голосов
/ 19 октября 2019

Я думаю, что вы должны print @SQL2 пройти через цикл, чтобы увидеть неправильное значение.

Было бы полезно показать, как вам declare @MES_EN_CURSO и declare @MES_ANTERIOR.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...