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.