table - sql server select procedure




SQL Server-SELECT FROM procedimento armazenado (10)

Eu tenho um procedimento armazenado que retorna linhas:

CREATE PROCEDURE MyProc
AS
BEGIN
    SELECT * FROM MyTable
END

Meu procedimento atual é um pouco mais complicado, e é por isso que um sproc é necessário.

É possível selecionar a saída chamando este procedimento?

Algo como:

SELECT * FROM (EXEC MyProc) AS TEMP

Preciso usar SELECT TOP X , ROW_NUMBER e uma cláusula WHERE adicional para WHERE meus dados, e realmente não quero passar esses valores como parâmetros.


Não é necessário usar uma tabela temporária.

Esta é a minha solução

SELECT  *  FROM    
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
WHERE somefield = anyvalue

Parece que você só precisa usar uma view . Uma visualização permite que uma consulta seja representada como uma tabela para que ela, a visualização, possa ser consultada.


Se 'DATA ACCESS' for falso,

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

depois de,

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

funciona.


Se o seu servidor é chamado SERVERX por exemplo, foi assim que eu fiz ...

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);

Para verificar isso funcionou, eu comentei a linha de comando EXEC() e a substituí com SELECT @CMD para revisar o comando antes de tentar executá-lo! Isso era para garantir que todo o número correto de citações simples estivesse no lugar certo. :-)

Espero que ajude alguém.


Você deve ler sobre OPENROWSET e OPENQUERY

SELECT  * 
INTO    #tmp FROM    
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')

Você deve olhar para este excelente artigo de Erland Sommarskog:

Basicamente, lista todas as opções disponíveis para o seu cenário.


Você pode copiar a saída de sp para a tabela temporária.

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

Você pode enganar um pouco com o OPENROWSET:

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

Isso ainda rodaria o SP inteiro toda vez, é claro.


Você precisa declarar um tipo de tabela que contém o mesmo número de colunas que o procedimento de armazenamento está retornando. Os tipos de dados das colunas no tipo de tabela e as colunas retornadas pelos procedimentos devem ser iguais

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

Então você precisa inserir o resultado do seu procedimento armazenado em seu tipo de tabela que acabou de definir

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

No final, basta selecionar o tipo de tabela

Select * from @MyTableType





stored-procedures