Dans certains cas avec SQL Server, il peut y avoir une instance où vous souhaitez 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 présenter quelques options, en fonction de vos besoins spécifiques et de la configuration de votre base de données.
Avant d’examiner les méthodes spécifiques, créons une procédure d’exemple. Bien que cela ne soit pas particulièrement utile, créons la procédure BooksByPrimaryAuthor
, qui accepte le paramètre @PrimaryAuthor
et saisit les enregistrements de notre table books
où cette @PrimaryAuthor
correspond. L’instruction de génération de procédure pourrait ressembler à ceci :
CREATE PROC BooksByPrimaryAuthor @PrimaryAuthor nvarchar(100)ASBEGIN SELECT * FROM books WHERE primary_author = @PrimaryAuthor;ENDGO
Enfin, ce que nous aimerions faire, c’est quelque chose comme ceci, où nous SELECT
les données résultantes de notre procédure et les insérons dans une table temporaire :
SELECT *INTO #tmpSortedBooksFROM EXEC BooksByPrimaryAuthor 'Tolkien'
Le problème est que la syntaxe ci-dessus est impropre et ne fonctionnera pas. Nous avons besoin d’une nouvelle méthode.
Utilisation de l’instruction OPENROWSET
Une possibilité est d’utiliser l’instruction OPENROWSET
, qui vous permet d’accéder à des données distantes à partir d’une source OLE DB et qui peut être exécutée directement à partir d’une autre instruction SQL. OPENROWSET
est une méthode de connexion et d’extraction de données à usage unique, elle ne doit donc pas être utilisée pour des connexions fréquentes (la liaison entre serveurs est préférable dans ce cas).
OPENROWSET
peut être la cible de n’importe quelle INSERT
DELETE
, ou UPDATE
déclaration, ce qui la rend idéale pour nos objectifs d' »exécuter » notre procédure stockée à notre place et d’extraire ces données vers notre table temporaire en attente.
Avant d’utiliser OPENROWSET
, il peut être nécessaire de modifier certaines options de configuration, spécifiquement en permettant un accès ad hoc. Ceci peut être configuré à l’aide des déclarations suivantes :
sp_configure 'Show Advanced Options', 1GORECONFIGUREGOsp_configure 'Ad Hoc Distributed Queries', 1GORECONFIGUREGO
Nous pouvons maintenant utiliser OPENROWSET
, qui possède une syntaxe particulière à laquelle il faut se conformer :
OPENROWSET( <PROVIDER_NAME>, <DATA_SOURCE>, <OPTIONS>)
Donc, nous pouvons exécuter notre procédure stockée à travers OPENROWSET
et la passer à notre table temporaire comme ceci :
Vous devrez peut-être modifier les valeurs PROVIDER_NAME
et DATA_SOURCE
pour vos propres besoins.
Utilisation d’une fonction définie par l’utilisateur
Il y a quelques inconvénients à la méthode OPENROWSET
, à savoir qu’elle nécessite des autorisations/configurations ad hoc comme nous l’avons vu plus haut, et aussi OPENROWSET
n’est capable de 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 à la place.
Dans notre exemple, cela ressemblerait à quelque chose comme ceci :
CREATE FUNCTION BooksByPrimaryAuthor( @PrimaryAuthor nvarchar(100))RETURNS TABLEASRETURN 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 celle souhaitée ci-dessus en utilisant OPENROWSET
:
SELECT *INTO #tmpSortedBooksFROM BooksByPrimaryAuthor('Tolkien')
Dans le cas où vous avez vraiment besoin d’une procédure stockée, vous pouvez également envelopper votre fonction dans une procédure stockée également.
0 commentaire