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 broche é necessário.
É possível selecionar a saída chamando este procedimento?
Algo como:
SELECT * FROM (EXEC MyProc) AS TEMP
Eu preciso usar SELECT TOP X
, ROW_NUMBER
e um adicional WHERE
cláusula para a página meus dados, e eu realmente não quero passar esses valores como parâmetros.
sql
sql-server
sql-server-2005
stored-procedures
jonathanpeppers
fonte
fonte
Respostas:
Você pode usar uma função definida pelo usuário ou uma exibição em vez de um procedimento.
Um procedimento pode retornar vários conjuntos de resultados, cada um com seu próprio esquema. Não é adequado para uso em uma
SELECT
declaração.fonte
Você pode
... sql ....
fonte
INSERT #T
ouINSERT @T
é que umaINSERT EXEC
instrução não pode ser aninhada. Se o procedimento armazenado já tiver umINSERT EXEC
, isso não funcionará.Você deseja uma função com valor de tabela ou insere seu EXEC em uma tabela temporária:
fonte
INSERT #T
ouINSERT @T
é que umaINSERT EXEC
instrução não pode ser aninhada. Se o procedimento armazenado já tiver umINSERT EXEC
, isso não funcionará.Você deve ler sobre o OPENROWSET e OPENQUERY
fonte
Você precisa declarar um tipo de tabela que contém o mesmo número de colunas que seu procedimento de armazenamento está retornando. Os tipos de dados das colunas no tipo de tabela e as colunas retornadas pelos procedimentos devem ser os mesmos
Então você precisa inserir o resultado do seu procedimento armazenado no tipo de tabela que você acabou de definir
No final, basta selecionar do seu tipo de mesa
fonte
Não é necessário usar uma tabela temporária.
Esta é a minha solução
fonte
sp_serveroption 'MYSERVER', 'DATA ACCESS', TRUE;
Você pode copiar a saída de sp para a tabela temporária.
fonte
use OPENQUERY e antes de executar o conjunto 'SET FMTONLY OFF; DEFINIR NOCOUNT ON; '
Tente este código de exemplo:
fonte
Tente converter seu procedimento em uma função embutida que retorne uma tabela da seguinte maneira:
E então você pode chamá-lo como
Você também tem a opção de passar parâmetros para a função da seguinte maneira:
E chame
fonte
Se 'DATA ACCESS' for falso,
depois de,
funciona.
fonte
Você pode trapacear um pouco com OPENROWSET:
Isso ainda executaria todo o SP toda vez, é claro.
fonte
Por uma questão de simplicidade e para torná-lo executável novamente, usei o sistema StoredProcedure "sp_readerrorlog" para obter dados:
fonte
Parece que você pode precisar apenas usar uma visualização . Uma visão permite que uma consulta seja representada como uma tabela para que a visão possa ser consultada.
fonte
Se o seu servidor se chama SERVERX, por exemplo, foi assim que eu fiz ...
Para verificar isso funcionou, comentei a
EXEC()
linha de comando e a substitui porSELECT @CMD
a por revisar o comando antes de tentar executá-lo! Isso foi para garantir que todo o número correto de aspas simples estivesse no lugar certo. :-)Espero que ajude alguém.
fonte