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 INSERTDELETE, 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.

Categorias: Articles

0 comentários

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *