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