Em alguns casos com o SQL Server, pode haver uma instância em que você deseja obter os dados resultantes de um procedimento armazenado e inseri-los em uma tabela temporária para uso em outra consulta. Determinar como realizar essa tarefa pode ser um pouco difícil, por isso descreveremos brevemente algumas opções, dependendo de suas necessidades específicas e configuração do banco 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
BooksByPrimaryAuthor
procedimento, que aceita o @PrimaryAuthor
parâmetro e pega registros de nossos books
tabela em que @PrimaryAuthor
fósforos. A instrução de geração de procedimento pode ter esta aparência:CREATE PROC BooksByPrimaryAuthor
@PrimaryAuthor nvarchar(100)
AS
BEGIN
SELECT
*
FROM
books
WHERE
primary_author = @PrimaryAuthor;
END
GO
Idealmente, o que gostaríamos de fazer é algo assim, onde
SELECT
os dados resultantes do nosso procedimento e insira-os em uma tabela temporária:SELECT
*
INTO
#tmpSortedBooks
FROM
EXEC BooksByPrimaryAuthor 'Tolkien'
O problema é que a sintaxe acima é imprópria e não funcionará . Precisamos de um novo método.
Usando a instrução OPENROWSET
Uma possibilidade é usar o
OPENROWSET
instrução, que permite acessar dados remotos de uma fonte OLE DB e pode ser executada diretamente de dentro de outra instrução SQL. OPENROWSET
é uma conexão única e método de recuperação de dados, portanto, não deve ser utilizado para conexõ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 nossos propósitos de “executar” nosso procedimento armazenado para nós e extrair esses dados de volta para nossa tabela temporária de espera. Antes de usar
OPENROWSET
, pode ser necessário modificar algumas opções de configuração, especificamente permitindo acesso ad hoc. Isso pode ser configurado usando as seguintes instruções:sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO
Agora podemos utilizar
OPENROWSET
, que tem uma sintaxe específica que deve ser respeitada:OPENROWSET(
<PROVIDER_NAME>,
<DATA_SOURCE>,
<OPTIONS>
)
Assim, podemos executar nosso procedimento armazenado através de
OPENROWSET
e passe para nossa tabela temporária assim:SELECT
*
INTO
#tmpSortedBooks
FROM
OPENROWSET(
'SQLNCLI',
'Server=(local)\SQL2008;Trusted_Connection=yes;',
'EXEC BooksByPrimaryAuthor Tolkien'
)
Pode ser necessário alterar o
PROVIDER_NAME
e DATA_SOURCE
valores para seus próprios propósitos. Usando uma função definida pelo usuário
Existem algumas desvantagens no
OPENROWSET
método, ou seja, que requer permissões/configuração ad hoc como vimos acima, e também OPENROWSET
só é capaz de retornar um único conjunto de resultados (se vários conjuntos forem fornecidos, somente o primeiro conjunto de resultados será retornado). Portanto, outro método para executar essa tarefa é substituir efetivamente o procedimento armazenado por uma função definida pelo usuário.
Do nosso exemplo, seria algo assim:
CREATE FUNCTION BooksByPrimaryAuthor
(
@PrimaryAuthor nvarchar(100)
)
RETURNS TABLE
AS
RETURN
SELECT
*
FROM
books
WHERE
primary_author = @PrimaryAuthor;
GO
Esta função pode ser usada aproximadamente da mesma maneira desejada acima usando
OPENROWSET
:SELECT
*
INTO
#tmpSortedBooks
FROM
BooksByPrimaryAuthor('Tolkien')
No caso de você realmente precisar de um procedimento armazenado, você também pode agrupar sua função em um procedimento armazenado.