Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment insérer les résultats d'une procédure stockée dans une table temporaire dans SQL Server

Dans certains cas avec SQL Server, il peut arriver que vous souhaitiez prendre les données résultantes d'une procédure stockée et les insérer dans une table temporaire pour les utiliser dans une autre requête. Déterminer comment accomplir cette tâche peut être quelque peu difficile, nous allons donc brièvement décrire quelques options, en fonction de vos besoins spécifiques et de la configuration de la base de données.

Avant d'examiner les méthodes spécifiques, créons un exemple de procédure. Bien que cela ne soit pas particulièrement utile, créons le BooksByPrimaryAuthor procédure, qui accepte le @PrimaryAuthor paramètre et récupère les enregistrements de nos books table où ce @PrimaryAuthor allumettes. L'instruction de génération de procédure pourrait ressembler à ceci :

CREATE PROC BooksByPrimaryAuthor
  @PrimaryAuthor nvarchar(100)
AS
BEGIN
  SELECT
    *
  FROM
    books
  WHERE
    primary_author = @PrimaryAuthor;
END
GO

Idéalement, ce que nous aimerions faire, c'est quelque chose comme ça, où nous SELECT les données issues de notre procédure et insérez-les dans une table temporaire :

SELECT
  *
INTO
  #tmpSortedBooks
FROM
  EXEC BooksByPrimaryAuthor 'Tolkien'

Le problème est la syntaxe ci-dessus est incorrecte et ne fonctionnera pas . Nous avons besoin d'une nouvelle méthode.

Utilisation de l'instruction OPENROWSET

Une possibilité est d'utiliser le OPENROWSET instruction, qui vous permet d'accéder à des données distantes à partir d'une source OLE DB et peut être exécutée directement à partir d'une autre instruction SQL. OPENROWSET est une méthode de connexion et de récupération de données unique, elle ne doit donc pas être utilisée pour des connexions fréquentes (la liaison de serveurs est préférable dans ce cas).

OPENROWSET peut être la cible de n'importe quel INSERT , DELETE , ou UPDATE déclaration, ce qui le rend idéal pour nos besoins «d'exécution» de notre procédure stockée pour nous et d'extraction de ces données vers notre table temporaire en attente.

Avant d'utiliser OPENROWSET , il peut être nécessaire de modifier certaines options de configuration, notamment en autorisant un accès ad hoc. Cela peut être configuré à l'aide des instructions suivantes :

sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO

Nous pouvons maintenant utiliser OPENROWSET , qui a une syntaxe particulière à respecter :

OPENROWSET(
  <PROVIDER_NAME>,
  <DATA_SOURCE>,
  <OPTIONS>
)

Ainsi, nous pouvons exécuter notre procédure stockée via OPENROWSET et passez-le à notre table temporaire comme suit :

SELECT
  *
INTO
  #tmpSortedBooks
FROM
  OPENROWSET(
    'SQLNCLI',
    'Server=(local)\SQL2008;Trusted_Connection=yes;',
    'EXEC BooksByPrimaryAuthor Tolkien'
)

Vous devrez peut-être modifier le PROVIDER_NAME et DATA_SOURCE valeurs pour vos propres besoins.

Utiliser une fonction définie par l'utilisateur

Il y a quelques inconvénients à l'OPENROWSET méthode, à savoir qu'elle nécessite des autorisations/configuration ad hoc comme nous l'avons vu ci-dessus, et aussi OPENROWSET ne peut renvoyer qu'un seul ensemble de résultats (si plusieurs ensembles sont fournis, seul le premier ensemble de résultats est renvoyé).

Par conséquent, une autre méthode pour effectuer cette tâche consiste à remplacer efficacement la procédure stockée par une fonction définie par l'utilisateur.

D'après notre exemple, cela ressemblerait à ceci :

CREATE FUNCTION BooksByPrimaryAuthor
(
  @PrimaryAuthor nvarchar(100)
)
RETURNS TABLE
AS
RETURN
  SELECT
    *
  FROM
    books
  WHERE
    primary_author = @PrimaryAuthor;
GO

Cette fonction peut ensuite être utilisée à peu près de la même manière que ci-dessus en utilisant OPENROWSET :

SELECT
  *
INTO
  #tmpSortedBooks
FROM
  BooksByPrimaryAuthor('Tolkien')

Si vous avez vraiment besoin d'une procédure stockée, vous pouvez également encapsuler votre fonction dans une procédure stockée.