Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como inserir os resultados de um procedimento armazenado em uma tabela temporária no SQL Server


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.