Em alguns casos com o SQL Server, pode haver uma instância em que se pretenda pegar nos dados resultantes de um procedimento armazenado e inseri-los numa tabela temporária para utilização noutra consulta. Determinar como realizar esta tarefa pode ser algo difícil, por isso esboçaremos brevemente algumas opções, dependendo das suas necessidades específicas e configuração da base de dados.
Antes de examinarmos os métodos específicos, vamos criar um procedimento de exemplo. Embora não seja particularmente útil, vamos criar o procedimento BooksByPrimaryAuthor
, que aceita o @PrimaryAuthor
parâmetro e agarra os registos do nosso books
tabela onde aquele @PrimaryAuthor
corresponde. A declaração de geração do procedimento pode parecer-se com isto:
CREATE PROC BooksByPrimaryAuthor @PrimaryAuthor nvarchar(100)ASBEGIN SELECT * FROM books WHERE primary_author = @PrimaryAuthor;ENDGO
Idealmente, o que gostaríamos de fazer é algo como isto, onde nós SELECT
os dados resultantes do nosso procedimento e inserimo-los numa tabela temporária:
SELECT *INTO #tmpSortedBooksFROM EXEC BooksByPrimaryAuthor 'Tolkien'
O problema é que a sintaxe acima é imprópria e não vai funcionar. Precisamos de um novo método.
Usando a declaração OPENROWSET
Uma possibilidade é usar a declaração OPENROWSET
, que lhe permite aceder a dados remotos a partir de uma fonte OLE DB e pode ser executada directamente a partir de outra declaração SQL. é um método único de ligação e recuperação de dados, pelo que não deve ser utilizado para ligações frequentes (ligar servidores é preferível nesse caso).
OPENROWSET
pode ser o alvo de qualquer INSERT
DELETE
, ou UPDATE
declaração, o que o torna ideal para os nossos propósitos de “executar” o nosso procedimento armazenado para nós e extrair esses dados de volta para a nossa mesa de espera temporária.
antes de utilizar OPENROWSET
, pode ser necessário modificar algumas opções de configuração, especificamente permitindo o acesso ad hoc. Isto pode ser configurado utilizando as seguintes afirmações:
sp_configure 'Show Advanced Options', 1GORECONFIGUREGOsp_configure 'Ad Hoc Distributed Queries', 1GORECONFIGUREGO
Agora podemos utilizar OPENROWSET
, que tem uma sintaxe particular que deve ser respeitada:
OPENROWSET( <PROVIDER_NAME>, <DATA_SOURCE>, <OPTIONS>)
Assim, podemos executar o nosso procedimento armazenado através de OPENROWSET
e passá-lo para a nossa mesa temporária desta forma:
Talvez tenha de alterar os valores PROVIDER_NAME
e DATA_SOURCE
para os seus próprios fins.
Usando uma Função Definida pelo Utilizador
Há algumas desvantagens no método OPENROWSET
, nomeadamente que requer permissões/configuração ad hoc como vimos acima, e também OPENROWSET
só é capaz de devolver um único conjunto de resultados (se forem fornecidos vários conjuntos, apenas o primeiro conjunto de resultados é devolvido).
Por conseguinte, outro método para executar esta tarefa é substituir efectivamente o procedimento armazenado por uma função definida pelo utilizador.
Do nosso exemplo, isso pareceria algo como isto:
CREATE FUNCTION BooksByPrimaryAuthor( @PrimaryAuthor nvarchar(100))RETURNS TABLEASRETURN SELECT * FROM books WHERE primary_author = @PrimaryAuthor;GO
Esta função pode então ser utilizada aproximadamente da mesma forma que a desejada acima usando OPENROWSET
:
SELECT *INTO #tmpSortedBooksFROM BooksByPrimaryAuthor('Tolkien')
No caso de necessitar realmente de um procedimento armazenado, também pode envolver a sua função dentro de um procedimento armazenado.
0 comentários