Il peut être intéressant de pouvoir utiliser une procédure stockée dans n’importe quel contexte de base de données (sur la même instance SQL Server).
Voyons comment faire cela à l’aide de la procédure stockée système non documentée sp_MS_marksystemobject
Je cherchai à fournir à mes collègues développeurs SQL un moyen de générer des instructions CRUD (INSERT, SELECT, UPDATE, DELETE) de façon propre et générique.
Voici donc l’exemple de l’INSERT (je publierai les autres dans un billet à venir) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | USE master GO CREATE PROCEDURE dbo.sp__generate_INSERT @_table_name sysname, @_nb_tab tinyint = 0 AS BEGIN SET NOCOUNT ON DECLARE @sql varchar(max) SELECT @sql = CASE WHEN @sql IS NULL THEN REPLICATE(CHAR(9), @_nb_tab) + 'INSERT' + CHAR(9) + @_table_name + CHAR(13) + CHAR(10) + REPLICATE(CHAR(9), @_nb_tab) + '(' + CHAR(13) + CHAR(10) + REPLICATE(CHAR(9), @_nb_tab) + CHAR(9) + name ELSE @sql + CHAR(13) + CHAR(10) + REPLICATE(CHAR(9), @_nb_tab) + CHAR(9) + ', ' + name END FROM sys.columns WHERE object_id = OBJECT_ID(@_table_name) AND is_computed = 0 ORDER BY column_id SET @sql = @sql + CHAR(13) + CHAR(10) + REPLICATE(CHAR(9), @_nb_tab) + ')' PRINT @sql END |
Vous remarquerez que je me place dans le contexte de la base de données système master, qui est la seule dans laquelle vous pouvez marquer des procédures stockées comme objet système.
Un autre requis pour pouvoir utiliser une procédure stockée marquée comme objet système dans n’importe quel contexte de base de données de l’instance en cours, est de faire commencer le nom de la procédure stockée par « sp ».
Rien ne vous empêche de marquer la procédure stockée comme objet système, mais lorsque vous exécuterez une telle procédure stockée (dont le nom ne commence donc pas par « sp »), SQL Server « feindra » de ne pas trouver celle-ci.
Le marquage se fait de façon extrêmement simple, mais n’est pas documenté :
EXEC sp_MS_marksystemobject 'sp__generate_INSERT'
Et le tour est joué : vous pouvez générer le script d’INSERT en exécutant tout simplement :
1 2 3 4 | USE maBD GO EXEC sp__generate_INSERT 'maTable' |
Bonne génération !
ElSüket