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

[Snippets] Générer le script de création d’une table existante

$
0
0

Voici une petite procédure stockée qui permet d’imprimer le code permettant de créer une table existante.
Il ne permet pas encore de récupérer les commandes de création des indexes attachées à la table …

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
---------------------------------
-- Nicolas SOUQUET - 28/01/2009 -
---------------------------------
CREATE PROCEDURE uspScripteTable
  @nomTable SYSNAME,
  @copie BIT = 0,
  @execute BIT = 0
AS
BEGIN
  SET NOCOUNT ON
 
  DECLARE @script VARCHAR(MAX)
 
  SELECT    @script =
      ISNULL(@script, '') + CHAR(9) +
      COLONNES.name +
      CASE
        WHEN COMPCOL.object_id IS NOT NULL THEN ''
        ELSE ' ' + TYPES.name
        END + '' +
      CASE TYPES.name
        WHEN 'float' THEN '(' + CAST(COLONNES.precision AS VARCHAR) + ')'
        WHEN 'decimal' THEN '(' + CAST(COLONNES.precision AS VARCHAR) + ')'
        WHEN 'numeric' THEN '(' + CAST(COLONNES.precision AS VARCHAR) + ', ' + CAST(COLONNES.scale AS VARCHAR) + ')'
        WHEN 'binary' THEN '(' + CAST(COLONNES.max_length AS VARCHAR) + ')'
        WHEN 'varbinary' THEN '(' + CASE COLONNES.max_length WHEN -1 THEN 'max' ELSE CAST(COLONNES.max_length AS VARCHAR) END + ')'
        WHEN 'char' THEN '(' + CAST(COLONNES.max_length AS VARCHAR) + ')'
        WHEN 'varchar' THEN '(' + CASE COLONNES.max_length WHEN -1 THEN 'max' ELSE CAST(COLONNES.max_length AS VARCHAR) END + ')'
        WHEN 'nchar' THEN '(' + CAST(COLONNES.max_length AS VARCHAR) + ')'
        WHEN 'nvarchar' THEN '(' +  CASE COLONNES.max_length WHEN -1 THEN 'max' ELSE CAST(COLONNES.max_length AS VARCHAR) END + ')'
        ELSE ''
      END +
      CASE COLONNES.is_identity
        WHEN 0 THEN ''
        WHEN 1 THEN ' IDENTITY(' + CAST(IDENT_SEED(TABLES.name) AS VARCHAR) + ', ' + CAST(IDENT_INCR(TABLES.name) AS VARCHAR) + ')'
      END +
      CASE COLONNES.is_nullable
        WHEN 0 THEN ' NOT NULL'
        WHEN 1 THEN ' NULL'
      END +
      CASE
        WHEN FK_COLONNES.constraint_object_id IS NULL THEN ''
        ELSE ' CONSTRAINT FK_' + TABLES.name +
        CASE @copie
          WHEN 1 THEN '_COPIE'
          ELSE ''
          END
        + '_' + COLONNES.name + ' FOREIGN KEY (' + COLONNES.name + ') REFERENCES ' + SCHEMA_FK.name + '.' + TAB_FK.name + '(' + COL_FK.name + ')'
      END +
      CASE
        WHEN DF.object_id IS NULL THEN ''
        ELSE ' CONSTRAINT DF_' + TABLES.name +
        CASE @copie
          WHEN 1 THEN '_COPIE'
          ELSE ''
          END + '_' + COLONNES.name + ' DEFAULT ' + REPLACE(REPLACE(DF.definition, '(', ''), ')', '')
      END +
      CASE
        WHEN CHK.object_id IS NULL THEN ''
        ELSE ' CONSTRAINT CHK_' + TABLES.name +
        CASE @copie
          WHEN 1 THEN '_COPIE'
          ELSE ''
        END + '_' + COLONNES.name + ' CHECK (' + REPLACE(REPLACE(REPLACE(REPLACE(CHK.definition, '(', ''), ')', ''), '[', ''), ']', '') + ')'
      END +
      CASE
        WHEN COMPCOL.object_id IS NULL THEN ''
        ELSE ' AS (' + REPLACE(REPLACE(REPLACE(REPLACE(COMPCOL.definition, '(', ''), ')', ''), '[', ''), ']', '') + ')'
        END +
      CASE
        WHEN ISNULL(INDEXES.is_primary_key, 0) = 0 THEN ''
        ELSE ' CONSTRAINT PK_' + TABLES.name +
        CASE @copie
          WHEN 1 THEN '_COPIE'
          ELSE ''
        END + ' PRIMARY KEY'
      END +
      CASE
        WHEN ISNULL(INDEXES.is_unique_constraint, 0) = 0 THEN ''
        ELSE ' CONSTRAINT UQ_' + TABLES.name + '_' + COLONNES.name + ' UNIQUE'
      END + ',' + CHAR(10)
  FROM    sys.tables AS TABLES -- Tables
  INNER JOIN  sys.columns AS COLONNES
        ON TABLES.object_id = COLONNES.object_id -- Colonnes
  INNER JOIN  sys.types AS TYPES
        ON COLONNES.user_type_id = TYPES.user_type_id -- types
  LEFT JOIN  sys.index_columns COL_INDEX -- indexes
        ON COL_INDEX.object_id = COLONNES.object_id
        AND COL_INDEX.column_id = COLONNES.column_id
  LEFT JOIN  sys.indexes AS INDEXES
        ON INDEXES.object_id = COL_INDEX.object_id
        AND INDEXES.index_id = COL_INDEX.index_id
  LEFT JOIN  sys.default_constraints AS DF -- contraintes de valeur par défaut
        ON DF.parent_object_id = TABLES.object_id
        AND DF.parent_column_id = COLONNES.column_id
  LEFT JOIN  sys.check_constraints AS CHK -- contraintes CHECK
        ON CHK.parent_object_id = TABLES.object_id
        AND CHK.parent_column_id = COLONNES.column_id
  LEFT JOIN  sys.computed_columns AS COMPCOL -- colonnes calculées
        ON COMPCOL.column_id = COLONNES.column_id
        AND COMPCOL.object_id = TABLES.object_id
  LEFT JOIN  sys.foreign_key_columns AS FK_COLONNES
        ON FK_COLONNES.parent_object_id = TABLES.object_id
        AND FK_COLONNES.parent_column_id = COLONNES.column_id
  LEFT JOIN  sys.columns AS COL_FK
        ON FK_COLONNES.referenced_object_id = COL_FK.object_id
        AND FK_COLONNES.referenced_column_id = COL_FK.column_id
  LEFT JOIN  sys.tables AS TAB_FK
        ON COL_FK.object_id = TAB_FK.object_id
  LEFT JOIN  sys.schemas AS SCHEMA_FK
        ON SCHEMA_FK.schema_id = TAB_FK.schema_id
  WHERE    TABLES.name = @nomTable
 
  SELECT  @script = 'CREATE TABLE ' + S.name + '.' +
    CASE @copie
      WHEN 1 THEN T.name + '_COPIE'
      ELSE T.name
    END + CHAR(10) +
    '(' + CHAR(10) + SUBSTRING(@script, 1, LEN(@script) - 2) + CHAR(10) + ')'
  FROM  sys.schemas AS S
  JOIN  sys.tables AS T ON S.schema_id = T.schema_id
  WHERE  T.name = @nomTable
 
  PRINT @script
 
  IF @execute = 1
  BEGIN
    EXEC (@script)
  END
END

ElSuket


Viewing all articles
Browse latest Browse all 197

Trending Articles