SQL Server - хранимая процедура SELECT FROM

У меня есть хранимая процедура, которая возвращает строки:

CREATE PROCEDURE MyProc
AS
BEGIN
    SELECT * FROM MyTable
END

На самом деле моя процедура немного сложнее, поэтому необходим sproc.

Можно ли выбрать вывод, вызывая эту процедуру?

Что-то вроде:

SELECT * FROM (EXEC MyProc) AS TEMP

Мне нужно использовать SELECT TOP X, ROW_NUMBER, и дополнительное предложение WHERE для вывода данных на страницу, и я не хочу передавать эти значения в качестве параметров.

Комментарии к вопросу (3)

Вы можете

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

... sql ....

Declare @T Table ([column definitions here])
Insert @T Exec storedProcname params 
Select * from @T Where ...
Комментарии (3)

Вы должны смотреть на эту прекрасную статью Ерланд сайт sommarskog:

Это в основном список всех существующих вариантов для вашего сценария.

Комментарии (3)
Решение

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

Процедура может возвращать несколько результирующих наборов, каждый со своей собственной схемой. Это's не подходит для использования в оператор SELECT.

Комментарии (6)

Вам либо нужна Table-Valued function, либо вставьте свой EXEC во временную таблицу:

INSERT INTO #tab EXEC MyProc
Комментарии (1)

Вы должны прочитать о OPENROWSET и OPENQUERY

SELECT  * 
INTO    #tmp FROM    
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
Комментарии (2)

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

declare @MyTableType as table
(
FIRSTCOLUMN int
,.....
)  

Затем вам нужно вставить результат хранимой процедуры в свой тип таблицы вы только что определили

Insert into @MyTableType 
EXEC [dbo].[MyStoredProcedure]

В конце концов просто выберите из таблицы типа

Select * from @MyTableType
Комментарии (3)

Не надо использовать временную таблицу.

Это мое решение

SELECT  *  FROM    
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
WHERE somefield = anyvalue
Комментарии (6)

Вы можете скопировать вывод из СП в temporaty таблице.

CREATE TABLE #GetVersionValues
(
    [Index] int,
    [Name]  sysname,
    Internal_value  int,
    Character_Value sysname
)
INSERT #GetVersionValues EXEC master.dbo.xp_msver 'WindowsVersion'
SELECT * FROM #GetVersionValues
drop TABLE #GetVersionValues
Комментарии (0)

использовать openquery и перед выполнять набор 'набор FMTONLY выкл; установить параметр nocount на;'

Попробуйте этот пример кода:

SELECT top(1)*
FROM
OPENQUERY( [Server], 'SET FMTONLY OFF; SET NOCOUNT ON; EXECUTE  [database].[dbo].[storedprocedure]  value,value ')
Комментарии (0)

Попробуйте преобразовать вашу процедуру встроенная функция, которая возвращает таблицу следующим образом:

CREATE FUNCTION MyProc()
RETURNS TABLE AS
RETURN (SELECT * FROM MyTable)

И тогда вы можете назвать его как

SELECT * FROM MyProc()

У вас также есть возможность передачи параметров в функцию следующим образом:

CREATE FUNCTION FuncName (@para1 para1_type, @para2 para2_type , ... ) 

И называть это

SELECT * FROM FuncName ( @para1 , @para2 )
Комментарии (0)

Если 'доступ к данным' ложь,

EXEC sp_serveroption 'SQLSERVERNAME', 'DATA ACCESS', TRUE

после того,

SELECT  *  FROM OPENQUERY(SQLSERVERNAME, 'EXEC DBNAME..MyProc @parameters')

он работает.

Комментарии (0)

Вы можете обмануть немного с openrowset :

SELECT ...fieldlist...
FROM OPENROWSET('SQLNCLI', 'connection string', 'name of sp')
WHERE ...

Это все равно запустить весь СП каждый раз, конечно.

Комментарии (0)

Для простоты и сделайте им re-выполнимое, я использовал процедура системы "sp_readerrorlog", чтобы получить данные:

-----USING Table Variable
DECLARE @tblVar TABLE (
   LogDate DATETIME,
   ProcessInfo NVARCHAR(MAX),
   [Text] NVARCHAR(MAX)
)
INSERT INTO @tblVar Exec sp_readerrorlog
SELECT LogDate as DateOccured, ProcessInfo as pInfo, [Text] as Message FROM @tblVar

-----(OR): Using Temp Table
IF OBJECT_ID('tempdb..#temp') IS NOT NULL  DROP TABLE #temp;
CREATE TABLE #temp (
   LogDate DATETIME,
   ProcessInfo NVARCHAR(55),
   Text NVARCHAR(MAX)
)
INSERT INTO #temp EXEC sp_readerrorlog
SELECT * FROM #temp
Комментарии (0)

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

Комментарии (0)

Если ваш сервер называется например SERVERX, это, как я это сделал...

EXEC sp_serveroption 'SERVERX', 'DATA ACCESS', TRUE;
DECLARE @CMD VARCHAR(1000);
DECLARE @StudentID CHAR(10);
SET @StudentID = 'STUDENT01';
SET @CMD = 'SELECT * FROM OPENQUERY([SERVERX], ''SET FMTONLY OFF; SET NOCOUNT ON; EXECUTE MYDATABASE.dbo.MYSTOREDPROC ' + @StudentID + ''') WHERE SOMEFIELD = SOMEVALUE';
EXEC (@CMD);

Чтобы проверить, что все работает, я закомментировал метод exec (командная строка) и заменил еговыберите @УМК` просматривать команды, прежде чем пытаться выполнить его! Это было, чтобы убедиться, что все корректный номер один-цитаты в нужном месте. :-)

Я надеюсь, что помогает кто-то.

Комментарии (0)