Можете ли вы сделать выбор по результатам хранимой процедуры в T-SQL - PullRequest
5 голосов
/ 08 апреля 2009
select * from (EXEC sp_SomeStoredProc)

Если вы не можете этого сделать, то что мешает добавить его в стандарт SQL или T-SQL?

Ответы [ 5 ]

9 голосов
/ 08 апреля 2009

Вы не можете сделать это, однако вы можете сделать это как вставку. например,

insert mytable
exec myStoredProcedure

Кроме того, никогда не называйте свои хранимые процедуры sp_xxxx. Это связано с тем, что SQL всегда будет выполнять поиск в области системных хранимых процедур из-за sp_, прежде чем искать пользовательские хранимые процедуры, что приведет к небольшой потере производительности, которая может добавить его к значительному значению для часто выполняющегося процесса. *

2 голосов
/ 08 апреля 2009

Это возможно, но, конечно, не правильный путь:

USE test
GO
CREATE procedure dbo.select1 AS
SELECT 1 
GO
EXEC sp_addlinkedserver @server='OQtest', @datasrc='localhost', @provider='SQLNCLI', @srvproduct=''
GO
SELECT * FROM OPENQUERY(OQtest, 'test.dbo.select1')

Вам также может понадобиться настроить параметры безопасности на сервере, чтобы это работало.

1 голос
/ 08 апреля 2009

Вы можете использовать подход, описанный ck, но это не очень рекомендуется. Вы можете проверить раздел INSERT-EXEC отличного сообщения Как обмениваться данными между хранимыми процедурами с помощью Erland Sommarskog для получения более подробной информации.

1 голос
/ 08 апреля 2009

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

Create Function [dbo].[CsvToInt] ( @Array varchar(1000)) 
returns @IntTable table 
    (IntValue int)
AS
begin

    declare @separator char(1)
    set @separator = ','

    declare @separator_position int 
    declare @array_value varchar(1000) 

    set @array = @array + ','

    while patindex('%,%' , @array) <> 0 
    begin

      select @separator_position =  patindex('%,%' , @array)
      select @array_value = left(@array, @separator_position - 1)

        Insert @IntTable
        Values (Cast(@array_value as int))

      select @array = stuff(@array, 1, @separator_position, '')
    end

    return
end

А затем просто выберите из функции ...

Select * FROM dbo.CsvToInt('1,2,3,5')

И вы получите табличное значение.

1 голос
/ 08 апреля 2009

Что если хранимый процесс не возвращает строк? Несколько наборов результатов? Изменения? Потенциальное использование хранимого процесса много и разнообразно.

Когда у вас есть SELECT * FROM TableOrView, существует прямая привязка и легко проверяемый синтаксис и структура.

Точнее, в реляционном смысле сохраненный процесс не является отношением / таблицей, поэтому вы не можете выбрать его.

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

...