Microsoft SQL Server
Transact-SQL

Select из результата выполнения хранимой процедуры

Опубликовано: 17 фев 05
Рейтинг:

Автор: Гавриленко Сергей Алексеевич
Прислал: Гавриленко Сергей Алексеевич

Зачастую встает вопрос, а как же использовать хранимую процедуру в запросе?
Хранимую процедуру в запросе использовать не получится. MSSQL Server 2000 такой функциональности не предоставляет. Есть несколько вариантов обхода это проблемы:
1. Оформить хранимую процедуру как функцию.

create function dbo.dataset ()
returns @out table (
	id int,
	name varchar(150)
) as begin
	insert @out(id, name)
	select EmployeeID, FirstName + ' ' + LastName
	from Northwind.dbo.Employees
	return
end
go

select *
from dbo.dataset() 
where name like '%King%'
Недостатки: в силу некоторых ограничений, накладываемых на синтаксис пользовательских функций, переписать хранимую процедуру в функцию иногда просто невозможно.

2. Получить набор через временную таблицу.
create procedure dbo.dataset_sp 
as begin
	set nocount on
	select EmployeeID, FirstName + ' ' + LastName
	from Northwind.dbo.Employees
end
go

create table #dataset(
	id int,
	name varchar(150)
)
insert #dataset exec dbo.dataset_sp

select *
from #dataset
where name like '%King%'

drop table #dataset
Недостатки:
  • таким образом можно получить только первый набор данных
  • невозможно "унаследовать" получение набора. При попытке получить таким образом набор из хранимой процедуры, которая в свою очередь получает набор из другой процедуры insert exec'ом, мы получим ошибку : An INSERT EXEC statement cannot be nested

  • Комментарии


    • 13 июня 2011, 15:51 Гавриленко Сергей Алексеевич

      http://www.sommarskog.se/share_data.html

    • 13 мая 2009, 11:52 ветерочек

      еще вариант , добавляем в процедуру параметр ИмяТаблицы куда занесём имя временной таблиы в которую хотим сохранить , в процедуре проверяем существование такой таблицы и если она есть динамическим SQL делаем инсерт

    • 13 мая 2009, 10:47 ветерочек

      еще вариант
      ...FROM OPENROWSET('SQLNCLI', 'Server=Server;Trusted_Connection=yes;',
      'exec spName') AS a;

    • 26 января 2009, 09:23 Charles Weyland

      обновите FAQ для SQL server 2003-2008
      а то уже 10 лет тому серверу, о котором речь идёт

    • =) только после того как отпостил посмотрел пункт 2 =)))
      только проснулся - не судите строго )))

    • use <Database_name>

      go

      create table dbo.#ltResult
      (
      itemtype_id int,
      itemtype_name varchar(40),
      out_cost decimal(12,2)
      )

      insert into dbo.#ltResult
      exec dbo.pGetSklad 0

    • Да ребята, после других серверов с MS SQL дело иметь неприятно. В другом месте я бы написал select данные from проца where поле='Москва'. А здесь нужно такой бред нести...

    • а еще каким-нибудь способом это возможно?

    • O4eni ne ploho

    • Есть способ №3 - через прилинкованный сервер. Проверено - работает.

    • good!

    • @anot@

    • @anot@

    • Универсальный вариант с динамическим sql не описан.

    • Спасибо за уточнение )

    • Спасибо, за уточнение

    • как получить наборы данных если структуры наборов данных разные???

    • Cущественная поправка. Спасибо за ответ вцелом

    • А что по другому никак ?



    Необходимо войти на сайт, чтобы оставлять комментарии

    Раздел FAQ: Microsoft SQL Server / Transact-SQL / Select из результата выполнения хранимой процедуры