2016-11-14 2 views
0

Я получаю сообщение об ошибке, описанное в названии, где мой код выглядит следующим образом:Тип ошибки преобразования данных VARCHAR в цифровой динамической оси

declare 
@cols numeric(10,0), 
@sql numeric(10,0) 

select @cols = isnull(@cols + ', ', '') + '[' + T.AmountPayd + ']' from (select distinct AmountPayd from t1) as T 

select @sql = ' 
    select * 
    from t1 as T 
     pivot 
     (
      sum(T.AmountPayd) for T.Customer in (' + @cols + ') 
      ) as P' 
exec sp_executesql @sql = @sql 

Ошибка возникает в этой строке:

select @cols = isnull(@cols + ', ', '') + '[' + T.AmountPayd + ']' from (select distinct AmountPayd from t1) as T 

В моя таблица AmountPayd объявляется как числовой тип данных. Ошибки я получаю:

Msg 8114, Level 16, State 5, строка 108 Ошибка преобразования типа данных VARCHAR в числовой.

+0

Вы хотите поделиться с этим кодом и сообщить об ошибке? –

+0

Ok Я отредактировал мой вопрос, где было добавлено сообщение об ошибке – vidooo

+2

'@ sql' не должно быть числовой переменной ... и не должно' @ cols' – scsimon

ответ

1

Вы объявили @cols как числовое (10,0), но вы пытаетесь присвоить ему текст.
Возможно, вам необходимо объявить его как nvarchar (max).


P.s. путем конкатенации AmountPayd, вы должны получить список клиентов?

+0

Я должен получить список клиентов и PaydAmounts, которые были оплачены в столбцах это то, что я поворачиваю. – vidooo

1
declare 
[email protected] numeric(10,0), 
[email protected] numeric(10,0) 
@cols varchar(max), 
@sql varchar(max) 

--Here you are setting @cols to a concatenated list of the amounts in your table 
--The problem is you are trying to concat a decimal or integer into a string without casting it 
--This is the same as doing 'A' + 1 and wanting to get A1. You first have to cast it. 
--Notice the CAST(T.AmountPayd AS VARCHAR). But cols still needs to be a varchar in your declaration. 

select @cols = isnull(@cols + ', ', '') + '[' + CAST(T.AmountPayd AS VARCHAR) + ']' from (select distinct AmountPayd from t1) as T 

--Here you are building your dynamic SQL, which is a string which is why @sql must be varchar or nvarchar 
select @sql = ' 
    select * 
    from t1 as T 
     pivot 
     (
      sum(T.AmountPayd) for T.Customer in (' + @cols + ') 
      ) as P' 
exec sp_executesql @sql = @sql 

Вы почти скопировали эту строку примера для строки, вы просто пропустили объявление своих переменных.

http://sqlhints.com/2014/03/18/dynamic-pivot-in-sql-server/

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