SQL Server – Comment appeler une procédure stockée dans une vue ou fonction avec un serveur lié récursif et OPENQUERY

Vous le savez peut être que SQL Server ne laisse pas passer les commandes CREATE VIEW basé sur les résultats des procédures stockées. Des fois ceci peut être pénalisant!

Imaginons une requête qui boucle sur chaque base de données d’une instance et qui insère les résultats dans une table temporaire de type #table.

CREATE TABLE #DB_NAMES (DB_NAMES VARCHAR(255))

EXEC sys.sp_MSforeachdb 'USE ?
INSERT INTO SELECT '
'?'''

SELECT * FROM #DB_NAMES

DROP TABLE #DB_NAMES

Ce code ne peut pas être incorporé dans une vue à cause du fait qu’il se base sur une #table. Vous pouvez, cependant créer une procédure stockée avec la requête.

USE [VOTRE_BASE]
GO

SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
CREATE PROCEDURE [dbo].[LOOPBACKTEST]
AS

CREATE TABLE #DB_NAMES (DB_NAMES VARCHAR(255))

EXEC sys.sp_MSforeachdb 'USE ?
INSERT INTO SELECT '
'?'''

SELECT * FROM #DB_NAMES

DROP TABLE #DB_NAMES

Maintenant, qu’est-ce qui se passe si on veut requêter sur les résultats de la procédure stockée? C’est là le problème. La réponse se trouve dans la clause OPENQUERY. Il s’agit d’une feinte/workaround mais SQL Server laisse passer des requêtes sur les résultats des requêtes sur des serveurs liés. Mais ceci est prévu pour marcher avec des serveurs distants non? Pas forcément! Vous pouvez créer ce que l’on appelle un serveur lié récursif.

EXEC sp_addlinkedserver @server = N'LOOPBACK',
    @srvproduct = N' ',
    @provider = N'SQLNCLI',
    @datasrc = N'VOTRE NOM D''INSTANCE SQL SERVER ICI',
    @catalog = N'VOTRE_BASE'

Une fois terminé vous pouvez requête sur les résultats de votre procédure stockée avec la syntaxe suivant :

SELECT  *
FROM    OPENQUERY([LOOPBACK], '
EXEC [YOUR_DATABASE].[dbo].[LOOPBACKTEST]'
)

Et vous pouvez même créer une vue qui se base sur la requête pour pouvoir requête souplement sur les résulats.

CREATE VIEW [dbo].[LOOPBACKTESTVIEW]
AS
SELECT  *
FROM    OPENQUERY([LOOPBACK], '
EXEC [VOTRE_BASE].[dbo].[LOOPBACKTEST]'
)
SELECT  *
dbo.LOOPBACKTESTVIEW
WHERE DB_NAMES LIKE 'VOTRE_%'

Sachez que ceci est simplement un exemple inutile mais vous pouvez faire ce que vous voulez dans la première requête afin de créer une contrôle introspective par exemple. Tout est possible ;)

Laisser un commentaire