Microsoft SQL Server 2000. Использование результатов хранимой процедуры в виде таблицы в SQL - PullRequest
4 голосов
/ 16 января 2009

Допустим, у меня есть myStoredProcedure, который принимает Id в качестве параметра и возвращает таблицу информации.

Можно ли написать оператор SQL, похожий на этот?

SELECT
    MyColumn
FROM
   Table-ify('myStoredProcedure ' + @MyId) AS [MyTable]

У меня такое ощущение, что это не так, но было бы очень полезно в моем сценарии с устаревшим кодом и связанными серверными таблицами

Спасибо!

Ответы [ 4 ]

5 голосов
/ 16 января 2009

Таким образом вы можете использовать функцию табличного значения.

Здесь это несколько хитростей ...

1 голос
/ 16 января 2009

Во время работы над проектом я использовал следующее, чтобы вставить результаты xp_readerrorlog (afaik, возвращает таблицу) во временную таблицу, созданную заранее.

 INSERT INTO [tempdb].[dbo].[ErrorLogsTMP]
 EXEC master.dbo.xp_readerrorlog

Из временной таблицы выберите нужные столбцы.

1 голос
/ 16 января 2009

Вот довольно хорошее обобщение способов обмена данными между хранимыми процедурами http://www.sommarskog.se/share_data.html.

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

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

SQL Server 2005 и SQL Server 2008 немного меняют параметры. SQL Server 2005+ значительно упрощает работу с XML. Таким образом, XML можно передавать как выходную переменную и довольно легко «измельчать» в таблицу, используя узлы и значения функций XML. Я считаю, что SQL 2008 позволяет передавать табличные переменные в хранимые процедуры (хотя только для чтения). Поскольку вы цитировали SQL 2000, усовершенствования 2005+ к вам не относятся, но я упомянул их для полноты.

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

1 голос
/ 16 января 2009

Нет, это не так - по крайней мере, ни в каком официальном или документированном виде - если только вы не измените свою хранимую процедуру на TVF.

Но, тем не менее, есть способы (читай), как это сделать. Все они в основном включали связанный сервер и использовали OpenQuery - например, см. здесь . Тем не менее, обратите внимание, что он довольно хрупкий, так как вам нужно жестко закодировать имя сервера - поэтому это может быть проблематично, если у вас есть несколько экземпляров сервера SQL с другим именем.

...