2015-06-22 3 views
0

меня такая ситуация в хранимой процедуре:TSQL - Ошибка в хранимой процедуре из-за ошибки преобразования

SET @DATE_RELEASE_START = '2015-01-01'; 
SET @DATE_RELEASE_END = '2015-05-31' 

    SELECT @statement = ' SELECT * 
          FROM (SELECT AFCDENTE, M.ID_MODIFICATION_CODE, COUNT(*) AS Conteggio--, CAST((COUNT(*) * 100/ 15032) AS decimal(10,7)) AS Percentage 
           FROM CIC_LOG_MODIFICHE AS L INNER JOIN ADM_MODIFICATION_CODE AS M ON L.CD_MODIFICATION_CODE = M.CD_MODIFICATION_CODE 
                  INNER JOIN CIC_PRODUZIONE AS P ON P.CD_CIC_PRODUZIONE = L.CD_CIC_PRODUZIONE 
           WHERE AFDTMODI BETWEEN '[email protected]_RELEASE_START+' AND '[email protected]_RELEASE_END+' AND P.CD_PLANT = '[email protected]_PLANT+' AND AFCDENTE IS NOT NULL 
           GROUP BY AFCDENTE, M.ID_MODIFICATION_CODE) as tbl 
         PIVOT (SUM(tbl.Conteggio) for tbl.ID_MODIFICATION_CODE in (' + @columns + ')) as pvt' 

я получаю эту ошибку:

Conversion failed when converting date and/or time from character string.

Я попытался литья эти даты, но никаких изменений. Я получаю ту же ошибку.

Что мне делать?

ответ

2

я предлагаю делать это так:

SET @DATE_RELEASE_START = '2015-01-01'; 
SET @DATE_RELEASE_END = '2015-05-31' 

    SELECT @statement = ' SELECT * 
          FROM (SELECT AFCDENTE, M.ID_MODIFICATION_CODE, COUNT(*) AS Conteggio--, CAST((COUNT(*) * 100/ 15032) AS decimal(10,7)) AS Percentage 
           FROM CIC_LOG_MODIFICHE AS L INNER JOIN ADM_MODIFICATION_CODE AS M ON L.CD_MODIFICATION_CODE = M.CD_MODIFICATION_CODE 
                  INNER JOIN CIC_PRODUZIONE AS P ON P.CD_CIC_PRODUZIONE = L.CD_CIC_PRODUZIONE 
           WHERE AFDTMODI BETWEEN @p0 AND @p1 AND P.CD_PLANT = @p2 AND AFCDENTE IS NOT NULL 
           GROUP BY AFCDENTE, M.ID_MODIFICATION_CODE) as tbl 
         PIVOT (SUM(tbl.Conteggio) for tbl.ID_MODIFICATION_CODE in (' + @columns + ')) as pvt' 

EXECUTE sp_executesql @statement, N'@p0 DATETIME2, @p1 DATETIME2, @p0 NVARCHAR(1000)', @p0 = @DATE_RELEASE_START, @p1 = @DATE_RELEASE_END, @p2 = @CD_PLANT; 

Вместо литья их как VARCHAR, просто передать их как переменные, а затем использовать sp_executesql сделать правильную работу.

+0

Ой! Вам нужно использовать 'YYYYMMDD', если тип' datetime' или передать компонент времени. 'YYYY-MM-DD' работает для типа' date' –

+0

Я использую 'DATETIME2' и согласно документации' YYYY-MM-DD' поддерживается. https://msdn.microsoft.com/en-us/library/bb677335.aspx исправьте меня, если я ошибаюсь. –

+1

хорошая работа. Он работает – Galma88

2

Вы должны процитировать строки даты в вашем SQL кода должным образом:

WHERE AFDTMODI BETWEEN '''[email protected]_RELEASE_START+''' AND '''[email protected]_RELEASE_END+''' 

В противном случае SQL будет читать

WHERE AFDTMODI BETWEEN 2015-01-01 AND 2015-05-31 

вместо

WHERE AFDTMODI BETWEEN '2015-01-01' AND '2015-05-31' 

У нас также были проблемы с передачей даты/времени значения хранимых процедур в Management Studio. Нам нужно было указать дату 20150101 или 20150531.

+0

Я получаю ту же ошибку – Galma88

+0

@ Galma88 Добавлен к моему ответу. –

+1

Как вы их прошли? Не существует двусмысленности в 'declare @start date = '2015-12-31', это создаст переменную с параметром date, с правильной датой. Вы смешивали даты с датами? В этом случае вам нужно либо указать полное время ISO, либо использовать «YYYYMMDD'format –

Смежные вопросы