Ошибка преобразования varchar в числовой в динамическом запросе sql

У меня есть требование, чтобы входной параметр, передаваемый в SP, имел числовой тип (18,6). Этот параметр передается в динамический запрос sql (тип varchar), а результат сохраняется во временной таблице. Во временной таблице я определил указанный выше тип столбца только как числовой. но при выполнении SP я получаю «ошибку при преобразовании типа данных varchar в числовой». Есть ли ограничение на использование динамического Sql? кто-нибудь, пожалуйста, помогите мне в этом.

образец запроса:

-------------
Input Parameter: @DataItem numeric(18,6) = ABC054356  (column name) 

CREATE TABLE #Temp1(RowNum int, 
                    CompanyID int, 
                    ABCColumn numeric(18,2), 
                    FiscalYear varchar(100))

DECLARE @QUERY varchar(max)

SET @QUERY = N'select row_number() over (partition by fy.keyinstn order by fy.fiscalyear desc) as RowNum, fy.Keyinstn, '
                        + Convert(@DataItem as numeric(18,2)))+
                        ', period.fiscalyear from ABCTable
................
................


INSERT into #Mnemonic
EXEC(@query)

Каковы ваши примерные входные значения?

Maharajan 10.09.2018 10:21

Преобразуйте параметр числового типа в строку для конкатенации строк, а затем преобразуйте в числовой 'SELECT CONVERT (' + Convert (@DataItem as varchar) + ', NUMERIC (18,2)'

Maharajan 10.09.2018 10:23

Здесь @DataItem = ABC054356 и ABC054356 - числовой (18,6) тип данных.

Tim 10.09.2018 10:37

ABC054356 будет именем столбца, а значения будут 1435.8765, 4356.8879, 0.0000 ....

Tim 10.09.2018 10:38

У вас неправильный синтаксис для использования ПЕРЕРАБАТЫВАТЬ. И вы должны использовать sp_executesql с параметрами. Для предотвращения атак SQL-инъекция. (не уверен, зачем вам нужен актерский состав только для заказа)

LukStorms 10.09.2018 10:41
0
5
901
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны преобразовать числовое значение в строку перед конкатенацией

SET @QUERY = N'select row_number() over (partition by fy.keyinstn order by fy.fiscalyear desc) as RowNum, fy.Keyinstn, '
                        + CONVERT(VARCHAR(20), @DataItem)+
                        ', period.fiscalyear from ABCTable ....... '
Ответ принят как подходящий

Очевидно, вы передаете в таблицу имя столбец, которое затем хотите преобразовать.

Если так, то это будет выглядеть так

declare @sql nvarchar(max);

set @sql = N'
select row_number() over (partition by fy.keyinstn order by fy.fiscalyear desc) as RowNum,
       fy.Keyinstn,
       convert(decimal(18, 2), [DataItem]) as [DataItem], 
       period.fiscalyear
from ABCTable
. . .
';

set @sql = replace(@sql, '[DataItem]', @DataItem);

insert into #Mnemonic
    exec(@query);

Нужно ли мне определять [DataItem]?

Tim 10.09.2018 11:03

@ Тим. . . Нет. replace() заменяет его именем столбца.

Gordon Linoff 10.09.2018 11:06

Другие вопросы по теме