Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Column name or number of supplied values does not match table definition.  [new]
Caxa_ASS
Member

Откуда:
Сообщений: 95
Всем привет.

Столкнулся со следующей проблемой. База данных имеет хранимую процедуру.
Процедура работает без проблем, выводит все необходимые данные, которые мне необходимо вставить дальше к примеру во временную таблицу.

Внутри процедуры уже есть INSERT ... EXEC, по этой причине я не могу воспользоваться вставкой результатов процедуры во временную таблицу, т.к. получу ошибку:

An INSERT EXEC statement cannot be nested.

Hашел решение данной ситуации -> http://www.t-sql.ru/post/An_INSERT_EXEC_statement_cannot_be_nested.aspx

Из данной ссылки наиболее подходящим, как по мне взял 4-й способ, но при его применении, а также при других, сталкиваюсь со следующей ошибкой:

Column name or number of supplied values does not match table definition.

1) Название столбцов таблицы в хранимой процедуре идентично названию столбцов таблицы в создаваемой переменной.
2) Тип данных также идентичен.
3) Порядок столбцов также есть аналогичным.

Ниже прикрепляю скриншот на котором указано две таблица из процедуры и таблица из переменной.

Каким образом можно сделать дебаг, чтобы понять в чем конкретно есть не сходство?
Возможно какие то другие варианты решения данной ситуации.
Буду благодарен за помощь.

К сообщению приложен файл. Размер - 54Kb
3 май 21, 15:54    [22317870]     Ответить | Цитировать Сообщить модератору
 Re: Column name or number of supplied values does not match table definition.  [new]
aleks222
Member

Откуда:
Сообщений: 1355
1. Костыли не обязаны работать.
2. Чем придумывать непромокаемый порох, перепишите процедуру под заполнение ВНЕШНЕЙ таблицы. Той же #All.
3 май 21, 16:15    [22317879]     Ответить | Цитировать Сообщить модератору
 Re: Column name or number of supplied values does not match table definition.  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1757
Caxa_ASS,


у вас ошибка скорее всего связанна с полем identity.
предполагаю что в процедуре у вас результирующий набор select * from #All

при стейтменте insert into @t exec у вас количество столбцов должно быть меньше на 1 поскольку значения для поля Id будут присвоены автоматически, поэтому в результирующем наборе не должно быть колонки под этот столбец.

а так в целом aleks222 правильно сказал - костыли с insert exec всегда могут стрельнуть, поменяет кто нибудь вашу процедуру, добавят новый столбец в выходной набор и опять будут пляски с поиском виноватого.

не ленитесь для инструкций insert указывать весь список столбцов.
3 май 21, 17:16    [22317896]     Ответить | Цитировать Сообщить модератору
 Re: Column name or number of supplied values does not match table definition.  [new]
vikkiv
Member

Откуда: EU
Сообщений: 2941
а разве xp_cmdshell по стандарту не возвращает только одну колонну с названием [output] ?
3 май 21, 17:47    [22317900]     Ответить | Цитировать Сообщить модератору
 Re: Column name or number of supplied values does not match table definition.  [new]
Caxa_ASS
Member

Откуда:
Сообщений: 95
felix_ff,

1) 'у вас ошибка скорее всего связанна с полем identity.' - возможно, но для теста, a) удалил столбец Id в таблице с процедурой, так и в таблице с переменной, без результата; б) удалил только из таблицы в переменной, так же без результата.

2) 'предполагаю что в процедуре у вас результирующий набор select * from #All' - если я Вас правильно понимаю, то под словом результирующий набор - это вывод таблицы с данными, т.е. то, что я хочу чтобы выводилось, да, в конце процедуры:
select * from #All
drop table #All

для теста, убрал * вписал все столбцы, без результатно.

3) 'не ленитесь для инструкций insert указывать весь список столбцов' - сама процедура это набор процедур с INSERT во временную таблицу т.е.

create procedure dbo.All_data.

begin
   create table #All (...)
   ....
   insert into #All
   exec Statistics_from_all_table_1
   insert into #All
   exec Statistics_from_table_2
   .....
   insert into #All
   exec Statistics_from_all_table_3

   select * from #All (для теста убирал * и вписывал все столбцы)
   drop table #All

end;


4) 'не ленитесь для инструкций insert указывать весь список столбцов' - в процедурах которые входят в состав процедур dbo.All_data, для INSERT указаны именно названия столбцов.

Сообщение было отредактировано: 3 май 21, 17:42
3 май 21, 17:49    [22317901]     Ответить | Цитировать Сообщить модератору
 Re: Column name or number of supplied values does not match table definition.  [new]
Caxa_ASS
Member

Откуда:
Сообщений: 95
.

Сообщение было отредактировано: 3 май 21, 17:44
3 май 21, 17:50    [22317903]     Ответить | Цитировать Сообщить модератору
 Re: Column name or number of supplied values does not match table definition.  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1757
Caxa_ASS
felix_ff,

1) 'у вас ошибка скорее всего связанна с полем identity.' - возможно, но для теста, a) удалил столбец Id в таблице с процедурой, так и в таблице с переменной, без результата; б) удалил только из таблицы в переменной, так же без результата.


я вам писал о том что в процедуре у вас результирующий набор должен возвразаться так:
create or alter proc [dbo].[All_data]
as
....

select 
      [Name],
      [Cost],
      [Change_Percent],
      [x_1],
      [x_2],
      [x_3],
      [x_4],
      [x_5],
      [x_6],
      [x_7],
      [x_8],
      [x_9],
      [x_10],
      [x_11]
from #All;


а в инструкции которую вы используете как insert exec

должны быть указаны столбцы:
declare @t table ([id] int identity, [Name] nvarchar(30), [Cost] nvarchar(30), [Change_Percent] nvarchar(30), 
[x_1] nvarchar(30),
[x_2] nvarchar(30),
[x_3] nvarchar(30),
[x_4] nvarchar(30),
[x_5] nvarchar(30),
[x_6] nvarchar(30),
[x_7] nvarchar(30),
[x_8] nvarchar(30),
[x_9] nvarchar(30),
[x_10] nvarchar(30),
[x_11] nvarchar(30));

insert into @t ([Name], [Cost], [Change_Percent], [x_1], [x_2], [x_3], [x_4], [x_5], [x_6], [x_7], [x_8], [x_9], [x_10], [x_11])
exec master..xp_cmdShell 'sqlcmd -E -q "exec TestDB.dbo.All_data" -h -1 -W';

select * from @t;
3 май 21, 20:09    [22317948]     Ответить | Цитировать Сообщить модератору
 Re: Column name or number of supplied values does not match table definition.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8587
Caxa_ASS,

Используйте функцию вместо процедуры. Эти лайфхаки потом боком выйдут.
4 май 21, 17:56    [22318428]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить