@@ -19,6 +19,8 @@ DECLARE
19
19
@ColPrecision int ,
20
20
@ColScale int ,
21
21
@ColTextLength varchar (5 ),
22
+ @ColIsComputed bit ,
23
+ @ColComputedDefintion varchar (max ),
22
24
@Seed int ,
23
25
@Increment int ,
24
26
@FirstColumn char (1 ) = ' ' ,
@@ -28,6 +30,9 @@ DECLARE
28
30
@ConstraintType varchar (2 ),
29
31
-- Variables for Indexes
30
32
@IndexName varchar (128 ),
33
+ @IndexType varchar (128 ),
34
+ @IndexedColumns varchar (max ),
35
+ @IndexIncludedColumns varchar (max ),
31
36
-- Variables for Data Migration
32
37
@InsertCols varchar (max ),
33
38
@InsertSql nvarchar (max )
@@ -40,6 +45,14 @@ Declare @Scripts Table(
40
45
SchemaName varchar (128 )
41
46
)
42
47
48
+ DECLARE @Indices Table
49
+ (
50
+ IndexName varchar (128 ),
51
+ [IndexType] varchar (50 ),
52
+ IndexedColumns varchar (Max ),
53
+ IncludedColumns varchar (max )
54
+ )
55
+
43
56
-- Base line everything by dropping any temp tables that are still around
44
57
IF OBJECT_ID (' tempdb..#tables' ) IS NOT NULL
45
58
DROP TABLE #tables
@@ -78,18 +91,19 @@ order by create_date asc
78
91
79
92
While EXISTS (SELECT [Name] FROM #Tables)
80
93
BEGIN
81
- SELECT TOP 1
94
+ SELECT TOP 1
82
95
@TableObjectId = [object_id],
83
96
@TableName = [Name],
84
97
@SchemaName = [SchemaName]
85
98
FROM #tables;
86
-
99
+
87
100
SET @SQL = ' ' ;
88
101
SET @InsertCols = ' ' ;
89
102
90
103
IF OBJECT_ID (' tempdb..#ColumnData' ) IS NOT NULL
91
104
DROP TABLE #ColumnData;
92
105
106
+ -- Get a list of all the columns
93
107
select
94
108
col.[Name] As ColName,
95
109
types.[name] as TypeName,
@@ -107,8 +121,8 @@ BEGIN
107
121
inner join sys .types types on col .user_type_id = types .user_type_id
108
122
WHERE [object_id] = @TableObjectId
109
123
order by Column_id
110
-
111
- SET @FirstColumn = ' ' ;
124
+
125
+ SET @FirstColumn = ' ' ;-- This is used for toggling when to a comma in a series of fields
112
126
113
127
While EXISTS (SELECT TOP 1 [ColName] FROM #ColumnData)
114
128
BEGIN
@@ -126,53 +140,60 @@ BEGIN
126
140
,@colMaxLength = max_length
127
141
,@colprecision = precision
128
142
,@colScale = scale
143
+ ,@ColIsComputed = is_computed
129
144
FROM #ColumnData
130
145
Order by column_id
131
146
132
- -- For text fields length is the number of bytes. for nvarchar and nchar it takes two bytes to store a character that is why we divide by 2
133
- SELECT @ColTextLength = CASE @ColMaxLength
134
- WHEN - 1 THEN ' max'
135
- ELSE
136
- CASE WHEN @dataType = ' nvarchar' OR @dataType = ' nchar' THEN
137
- CONVERT (varchar (4 ),@ColMaxLength / 2 )
138
- ELSE
139
- CONVERT (varchar (4 ),@ColMaxLength)
140
- END
141
- END
142
-
143
- SET @SQL = @SQL + @FirstColumn + ' ' + @ColumnName + ' ' +
144
- CASE @dataType
145
- WHEN ' varchar' THEN ' varchar(' + @ColTextLength + ' )'
146
- WHEN ' char' THEN ' char(' + @ColTextLength + ' )'
147
- WHEN ' nvarchar' THEN ' nvarchar(' + @ColTextLength + ' )'
148
- WHEN ' nchar' THEN ' nchar(' + @ColTextLength + ' )'
149
- WHEN ' decimal' then ' decimal(' + CONVERT (varchar (3 ), @colPrecision) + ' ,' + CONVERT (varchar (3 ), @colScale) + ' )'
150
- WHEN ' numeric' then ' numeric(' + CONVERT (varchar (3 ), @colPrecision) + ' ,' + CONVERT (varchar (3 ), @colScale) + ' )'
151
- ELSE @dataType
152
- END
153
-
154
- if @ColIdentity = 1
147
+ SET @SQL = @SQL + @FirstColumn + ' ' + @ColumnName + ' '
148
+
149
+ if @ColIsComputed = 0
155
150
BEGIN
156
- SELECT @Seed = Convert (int , seed_value), @Increment = convert (int , increment_value)
157
- FROM sys .identity_columns
158
- WHERE [object_id] = @TableObjectId AND [name] = @ColumnName
151
+ -- For text fields length is the number of bytes. for nvarchar and nchar it takes two bytes to store a character that is why we divide by 2
152
+ SELECT @ColTextLength = CASE @ColMaxLength
153
+ WHEN - 1 THEN ' max'
154
+ ELSE
155
+ CASE WHEN @dataType = ' nvarchar' OR @dataType = ' nchar' THEN
156
+ CONVERT (varchar (4 ),@ColMaxLength / 2 )
157
+ ELSE
158
+ CONVERT (varchar (4 ),@ColMaxLength)
159
+ END
160
+ END
159
161
160
- SET @SQL = @SQL + ' IDENTITY(' + CONVERT (varchar (3 ), @Seed) + ' ,' + CONVERT (varchar (3 ),@Increment) + ' ) '
161
- END
162
+ SET @SQL = @SQL +
163
+ CASE @dataType
164
+ WHEN ' varchar' THEN ' varchar(' + @ColTextLength + ' )'
165
+ WHEN ' char' THEN ' char(' + @ColTextLength + ' )'
166
+ WHEN ' nvarchar' THEN ' nvarchar(' + @ColTextLength + ' )'
167
+ WHEN ' nchar' THEN ' nchar(' + @ColTextLength + ' )'
168
+ WHEN ' decimal' then ' decimal(' + CONVERT (varchar (3 ), @colPrecision) + ' ,' + CONVERT (varchar (3 ), @colScale) + ' )'
169
+ WHEN ' numeric' then ' numeric(' + CONVERT (varchar (3 ), @colPrecision) + ' ,' + CONVERT (varchar (3 ), @colScale) + ' )'
170
+ ELSE @dataType
171
+ END
162
172
163
- SELECT @ColDefault = d .definition
164
- FROM sys .default_constraints AS d
165
- WHERE d .parent_object_id = @ColObject
166
- AND d .parent_column_id = @ColId
173
+ if @ColIdentity = 1
174
+ BEGIN
175
+ SELECT @Seed = Convert (int , seed_value), @Increment = convert (int , increment_value)
176
+ FROM sys .identity_columns
177
+ WHERE [object_id] = @TableObjectId AND [name] = @ColumnName
167
178
168
- if NOT @ColDefault IS NULL
169
- SET @SQL = @SQL + ' DEFAULT' + @ColDefault
179
+ SET @SQL = @SQL + ' IDENTITY(' + CONVERT (varchar (3 ), @Seed) + ' ,' + CONVERT (varchar (3 ),@Increment) + ' ) '
180
+ END
181
+
182
+ if NOT @ColDefault IS NULL
183
+ SET @SQL = @SQL + ' DEFAULT' + @ColDefault
170
184
171
- if @ColNullable = 0
172
- SET @SQL = @SQL + ' NOT NULL '
185
+ if @ColNullable = 0
186
+ SET @SQL = @SQL + ' NOT NULL '
187
+ END
188
+ ELSE
189
+ BEGIN
190
+ SELECT @ColComputedDefintion = [definition]
191
+ from sys .computed_columns
192
+ where [OBJECT_ID] = @TableObjectId
193
+ and [column_id] = @ColId
173
194
174
- -- This code is for generating an insert statement
175
- SET @InsertCols = @InsertCols + @FirstColumn + ' ' + @ColumnName + ' ' ;
195
+ SET @SQL = @SQL + ' AS ' + @ColComputedDefintion
196
+ END
176
197
177
198
SET @FirstColumn = ' ,' ;
178
199
@@ -210,7 +231,157 @@ BEGIN
210
231
@SchemaName
211
232
)
212
233
234
+ INSERT INTO @Scripts
235
+ (
236
+ ScriptType,
237
+ TableName,
238
+ SqlStatement,
239
+ SchemaName
240
+ )
241
+ select ' Trigger' ,
242
+ @TableName,
243
+ m .definition ,
244
+ @SchemaName
245
+ from sys .sql_modules m
246
+ inner join sys .objects o on m .object_id = o .object_id
247
+ WHERE o .parent_object_id = @TableObjectId
248
+ and o.[Type] = ' TR'
249
+
250
+
251
+ -- Add in the indexes
252
+ INSERT INTO @Indices
253
+ (
254
+ IndexName,
255
+ [IndexType],
256
+ IndexedColumns,
257
+ IncludedColumns
258
+ )
259
+ SELECT
260
+ i .NAME AS ' IndexName'
261
+ ,LOWER (i .type_desc ) + CASE
262
+ WHEN i .is_unique = 1
263
+ THEN ' , unique'
264
+ ELSE ' '
265
+ END + CASE
266
+ WHEN i .is_primary_key = 1
267
+ THEN ' , primary key'
268
+ ELSE ' '
269
+ END AS [IndexType]
270
+ ,STUFF ((
271
+ SELECT ' , [' + sc .NAME + ' ]' AS " text()"
272
+ FROM syscolumns AS sc
273
+ INNER JOIN sys .index_columns AS ic ON ic .object_id = sc .id
274
+ AND ic .column_id = sc .colid
275
+ WHERE sc .id = so .object_id
276
+ AND ic .index_id = i1 .indid
277
+ AND ic .is_included_column = 0
278
+ ORDER BY key_ordinal
279
+ FOR XML PATH (' ' )
280
+ ), 1 , 2 , ' ' ) AS ' IndexedColumns'
281
+ ,STUFF ((
282
+ SELECT ' , [' + sc .NAME + ' ]' AS " text()"
283
+ FROM syscolumns AS sc
284
+ INNER JOIN sys .index_columns AS ic ON ic .object_id = sc .id
285
+ AND ic .column_id = sc .colid
286
+ WHERE sc .id = so .object_id
287
+ AND ic .index_id = i1 .indid
288
+ AND ic .is_included_column = 1
289
+ FOR XML PATH (' ' )
290
+ ), 1 , 2 , ' ' ) AS ' included_columns'
291
+ FROM sysindexes AS i1
292
+ INNER JOIN sys .indexes AS i ON i .object_id = i1 .id
293
+ AND i .index_id = i1 .indid
294
+ INNER JOIN sysobjects AS o ON o .id = i1 .id
295
+ INNER JOIN sys .objects AS so ON so .object_id = o .id
296
+ AND is_ms_shipped = 0
297
+ INNER JOIN sys .schemas AS s ON s .schema_id = so .schema_id
298
+ WHERE so .type = ' U'
299
+ AND i .is_primary_key = 0 -- don't want the primary key and unique constraints
300
+ AND i .is_unique = 0
301
+ AND i1 .indid < 255
302
+ AND i1 .STATUS & 64 = 0 -- index with duplicates
303
+ AND i1 .STATUS & 8388608 = 0 -- auto created index
304
+ AND i1 .STATUS & 16777216 = 0 -- stats no recompute
305
+ AND i .type_desc <> ' heap'
306
+ AND so .NAME <> ' sysdiagrams'
307
+ AND o .id = @TableObjectId
308
+
309
+ WHILE Exists ( SELECT top 1 IndexName FROM @Indices)
310
+ BEGIN
311
+ SELECT TOP 1
312
+ @IndexName = IndexName,
313
+ @IndexedColumns = IndexedColumns,
314
+ @IndexType = IndexType,
315
+ @IndexIncludedColumns = IncludedColumns
316
+ FROM @Indices
317
+
318
+ SET @SQL = ' CREATE ' + @IndexType + ' INDEX ' + @IndexName + ' ON ' + @SchemaName + ' .' + @TableName + ' ( ' + @IndexedColumns + ' ) '
319
+
320
+ if not @IndexIncludedColumns is null
321
+ BEGIN
322
+ SET @SQL = @SQL + ' INCLUDE (' + @IndexIncludedColumns + ' )'
323
+ END
324
+
325
+ INSERT INTO @Scripts
326
+ (
327
+ ScriptType,
328
+ TableName,
329
+ SqlStatement,
330
+ SchemaName
331
+ )
332
+ VALUES
333
+ (
334
+ ' Index' ,
335
+ @TableName,
336
+ @SQL,
337
+ @SchemaName
338
+ )
339
+ DELETE FROM @Indices WHERE IndexName = @IndexName
340
+ END
341
+
213
342
DELETE FROM #tables WHERE [object_id] = @TableObjectId
214
343
END
344
+ -- Functions
345
+ INSERT INTO @Scripts
346
+ (
347
+ ScriptType,
348
+ TableName,
349
+ SqlStatement,
350
+ SchemaName
351
+ )
352
+ select ' Functions' ,
353
+ o.[Name],
354
+ m .definition ,
355
+ @SchemaName
356
+ from sys .sql_modules m
357
+ inner join sys .objects o on m .object_id = o .object_id
358
+ WHERE o.[Type] in (' FN' , ' IF' , ' TF' )
359
+
360
+ -- Grab Procedures
361
+ INSERT INTO @Scripts
362
+ (
363
+ ScriptType,
364
+ TableName,
365
+ SqlStatement
366
+ )
367
+ select ' Procedures' ,
368
+ p .name ,
369
+ m .definition
370
+ from sys .procedures p
371
+ inner join sys .sql_modules m on p .object_id = m .object_id
372
+
373
+ INSERT INTO @Scripts
374
+ (
375
+ ScriptType,
376
+ TableName,
377
+ SqlStatement
378
+ )
379
+ select ' Views' ,
380
+ p .name ,
381
+ m .definition
382
+ from sys .views p
383
+ inner join sys .sql_modules m on p .object_id = m .object_id
384
+
385
+ SELECT * , LEN (SqlStatement) AS StatementLength FROM @Scripts;
386
+
215
387
216
- SELECT * FROM @Scripts;
0 commit comments