Quantcast
Channel: Le Blog SQL Server d'ElSüket » Utilitaires
Viewing all articles
Browse latest Browse all 87

Marquer une procédure stockée comme objet système : la procédure stockée sp_MS_marksystemobject

$
0
0

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 ;)


Viewing all articles
Browse latest Browse all 87

Trending Articles