:: Не фоксом единым
Синтаксис ms sql
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
В базе MS SQL есть хранимка, в ней такой код:

create table #employees([Id] [int],
[Login] [nvarchar](40),
[Name] [nvarchar](100),
[Surname] [nvarchar](120)
-- и ещё куча полей
);
insert into #employees EXEC [dbo].[getMyFunc] @UserId = 1

Проблема в том, что когда в getMyFunc меняют запрос, приходится и в эту хранимку добавлять поля. Добавлять только для того, что бы insert не ругался на отсутствие полей. Вопрос - можно как то в insert-е указать список полей? Или, сделать select [список полей] from EXEC?
Ratings: 0 negative/0 positive
Синтаксис ms sql
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Т.е. надо что то типа:

insert into #employees (select [Id],[Login] from (EXEC [dbo].[getMyFunc] @UserId = 1))
Ratings: 0 negative/0 positive
Re: Синтаксис ms sql
cool1

Сообщений: 316
Дата регистрации: 06.03.2016
getMyFunc - это процедура?

если да, то сделай из нее функцию, и exec будет не нужен



Исправлено 1 раз(а). Последнее : cool1, 22.11.18 17:58
Ratings: 0 negative/0 positive
Re: Синтаксис ms sql
cool1

Сообщений: 316
Дата регистрации: 06.03.2016
CREATE FUNCTION f1()
RETURNS @t1
TABLE(id int, name varchar(50))
AS
BEGIN
insert into @t1
select 1, 'name'
RETURN
END
GO
select id
from dbo.f1()
Ratings: 0 negative/0 positive
Re: Синтаксис ms sql
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
S-type
Проблема в том, что когда в getMyFunc меняют запрос, приходится и в эту хранимку добавлять поля
Ну напрашивается, отдать создание временной таблицы, в getMyFunc.
Не будет видна из хранимки?
По примеру не ясно, нужно ли это?

Задай вопрос на профильном форуме
www.sql.ru , там тебе правильнее ответят.
(Ох и получишь люлей))))
Ratings: 0 negative/0 positive
Re: Синтаксис ms sql
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
cool1
getMyFunc - это процедура?

Да.

cool1
если да, то сделай из нее функцию, и exec будет не нужен
А без функции, только изменив getMyFunc ни как нельзя?
Ratings: 0 negative/0 positive
Re: Синтаксис ms sql
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
S-type
А без функции, только изменив getMyFunc ни как нельзя?
Не ясно что надо в итоге.
Предложенный подход с табличной функцией, вернет 1 запись, нужна ли она?
Кусок задачи, с непонятным подходом к решению.
И в общем случае, если getMyFunc возвращает больше 1й записи, табличная функция, вообще ни при чем.
Да и вообще, не пойму чем она может помочь, ведь проблема в перечислении полей?
Напрашивается только динамика.
Ratings: 0 negative/0 positive
Re: Синтаксис ms sql
Гулин Федор

Сообщений: 4633
Откуда: Минск
Дата регистрации: 24.10.2002
зы я тоже не до конца понял задачи
динам. скл - возможно - но лучше избегать
Ratings: 0 negative/0 positive
Re: Синтаксис ms sql
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Попробую описать иначе. Есть Exec, возвращающий таблицу. Есть код:

create table #employees([Id] [int],
[Login] [nvarchar](40),
[Name] [nvarchar](100),
[Surname] [nvarchar](120)
-- и ещё куча полей
);
insert into #employees EXEC [dbo].[getMyFunc] @UserId = 1

В таблице #employees должны быть все поля, которые возвращаются в exec. Хотелось бы так:

create table #employees([Id] [int], -- оставлены только
[Login] [nvarchar](40) -- нужные поля
);
insert into #employees EXEC [dbo].[getMyFunc] @UserId = 1 -- тут ругается !

Ругается "нужны ещё поля".
Ratings: 0 negative/0 positive
Re: Синтаксис ms sql
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
getMyFunc - явно не удачное название для ПРОЦЕДУРы, простите, что запутал.




Так понимаю, что это не возможно, и надо уходить от процедуры.



Исправлено 1 раз(а). Последнее : S-type, 26.11.18 18:03
Ratings: 0 negative/0 positive
Re: Синтаксис ms sql
Рома

Сообщений: 1079
Дата регистрации: 06.06.2001
Из документации
Цитата:
If execute_statement is used with INSERT, each result set must be compatible with the columns in the table or in column_list

insert into #employees (список полей возвращаемых процедурой) EXEC [dbo].[getMyFunc] @UserId = 1
Ratings: 0 negative/0 positive
Re: Синтаксис ms sql
Владимир Максимов

Сообщений: 14095
Откуда: Москва
Дата регистрации: 02.09.2000
S-type
Так понимаю, что это не возможно, и надо уходить от процедуры.

Добавь в свою процедуру еще один параметр 0/1, при значении 1 чтобы он возвращал только фиксированный набор полей. Просто

if XXX = 1
SELECT с фиксированным набором полей
else
SELECT со всеми полями без ограничений
Ratings: 0 negative/1 positive
Re: Синтаксис ms sql
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Рома
Из документации
Цитата:
If execute_statement is used with INSERT, each result set must be compatible with the columns in the table or in column_list

insert into #employees (список полей возвращаемых процедурой) EXEC [dbo].[getMyFunc] @UserId = 1

Именно, что "список полей, возвращаемый процедурой". Когда процедуру меняют, она начинает возвращать всё больше и больше полей, и этот список приходится менять и в вызывающей процедуре. А хотелось бы указать

insert into #employees ([Id],[Login] ) EXEC [dbo].[getMyFunc] @UserId = 1

Но, так нельзя, ругается.

Придётся через функцию.
Ratings: 0 negative/0 positive
Re: Синтаксис ms sql
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Владимир Максимов
S-type
Так понимаю, что это не возможно, и надо уходить от процедуры.
Добавь в свою процедуру еще один параметр 0/1, при значении 1 чтобы он возвращал только фиксированный набор полей. Просто

Хороший вариант!

Спасибо за подсказку.



Исправлено 1 раз(а). Последнее : S-type, 30.11.18 10:23
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 8 (Гостей: 8)

© 2000-2024 Fox Club 
Яндекс.Метрика