|
1 | 1 | DECLARE
|
2 | 2 | --Variables for execution control
|
3 | | - @DropAndRecreate bit = 1, |
| 3 | + @DropAndRecreate bit = 0, |
4 | 4 | @SQL varchar(max),
|
5 | 5 | --Variables for Schemas
|
6 | 6 | @SchemaName varchar(128),
|
@@ -144,7 +144,7 @@ BEGIN
|
144 | 144 | FROM #ColumnData
|
145 | 145 | Order by column_id
|
146 | 146 |
|
147 | | - SET @SQL = @SQL + @FirstColumn + ' ' + @ColumnName + ' ' |
| 147 | + SET @SQL = @SQL + @FirstColumn + ' [' + @ColumnName + '] ' |
148 | 148 |
|
149 | 149 | if @ColIsComputed = 0
|
150 | 150 | BEGIN
|
@@ -200,7 +200,22 @@ BEGIN
|
200 | 200 | DELETE FROM #ColumnData WHERE ColName = @ColumnName;
|
201 | 201 | END
|
202 | 202 |
|
203 | | - SET @SQL = 'CREATE TABLE ' + @SchemaName + '.' + @TableName + ' (' + @SQL + ')'; |
| 203 | + SET @SQL = @SQL + |
| 204 | + ISNULL((SELECT CHAR(9) + ', CONSTRAINT [' + k.name + '] PRIMARY KEY (' + |
| 205 | + (SELECT STUFF(( |
| 206 | + SELECT ', [' + c.name + '] ' + CASE WHEN ic.is_descending_key = 1 THEN 'DESC' ELSE 'ASC' END |
| 207 | + FROM sys.index_columns ic WITH (NOWAIT) |
| 208 | + JOIN sys.columns c WITH (NOWAIT) ON c.[object_id] = ic.[object_id] AND c.column_id = ic.column_id |
| 209 | + WHERE ic.is_included_column = 0 |
| 210 | + AND ic.[object_id] = k.parent_object_id |
| 211 | + AND ic.index_id = k.unique_index_id |
| 212 | + FOR XML PATH(N''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '')) |
| 213 | + + ')' + CHAR(13) |
| 214 | + FROM sys.key_constraints k WITH (NOWAIT) |
| 215 | + WHERE k.parent_object_id = @TableObjectId |
| 216 | + AND k.[type] = 'PK'), '') + ')' + CHAR(13) |
| 217 | + |
| 218 | + SET @SQL = 'CREATE TABLE ' + @SchemaName + '.' + @TableName + ' (' + @SQL ; |
204 | 219 |
|
205 | 220 | IF @DropAndRecreate = 1
|
206 | 221 | INSERT INTO @Scripts
|
@@ -247,7 +262,6 @@ BEGIN
|
247 | 262 | WHERE o.parent_object_id = @TableObjectId
|
248 | 263 | and o.[Type] = 'TR'
|
249 | 264 |
|
250 | | - |
251 | 265 | --Add in the indexes
|
252 | 266 | INSERT INTO @Indices
|
253 | 267 | (
|
@@ -304,6 +318,7 @@ BEGIN
|
304 | 318 | AND i1.STATUS & 16777216 = 0 --stats no recompute
|
305 | 319 | AND i.type_desc <> 'heap'
|
306 | 320 | AND so.NAME <> 'sysdiagrams'
|
| 321 | + AND i.type_desc <> 'clustered' |
307 | 322 | AND o.id = @TableObjectId
|
308 | 323 |
|
309 | 324 | WHILE Exists( SELECT top 1 IndexName FROM @Indices)
|
@@ -341,6 +356,201 @@ BEGIN
|
341 | 356 |
|
342 | 357 | DELETE FROM #tables WHERE [object_id] = @TableObjectId
|
343 | 358 | END
|
| 359 | + |
| 360 | + --Going to pull in the keys. Not doing this with the table create in case this is being run with the bulk copy to ease the data in. |
| 361 | + INSERT INTO @Scripts |
| 362 | + ( |
| 363 | + ScriptType, |
| 364 | + TableName, |
| 365 | + SqlStatement, |
| 366 | + SchemaName |
| 367 | + ) |
| 368 | + SELECT |
| 369 | + 'Foreign Keys', |
| 370 | + ct.[name], |
| 371 | + 'ALTER TABLE ' |
| 372 | + + QUOTENAME(cs.name) + '.' + QUOTENAME(ct.name) |
| 373 | + + ' ADD CONSTRAINT ' + QUOTENAME(fk.name) |
| 374 | + + ' FOREIGN KEY (' + STUFF((SELECT ',' + QUOTENAME(c.name) |
| 375 | + -- get all the columns in the constraint table |
| 376 | + FROM sys.columns AS c |
| 377 | + INNER JOIN sys.foreign_key_columns AS fkc |
| 378 | + ON fkc.parent_column_id = c.column_id |
| 379 | + AND fkc.parent_object_id = c.[object_id] |
| 380 | + WHERE fkc.constraint_object_id = fk.[object_id] |
| 381 | + ORDER BY fkc.constraint_column_id |
| 382 | + FOR XML PATH(N''), TYPE).value(N'.[1]', N'nvarchar(max)'), 1, 1, N'') |
| 383 | + + ') REFERENCES ' + QUOTENAME(rs.name) + '.' + QUOTENAME(rt.name) |
| 384 | + + '(' + STUFF((SELECT ',' + QUOTENAME(c.name) |
| 385 | + -- get all the referenced columns |
| 386 | + FROM sys.columns AS c |
| 387 | + INNER JOIN sys.foreign_key_columns AS fkc |
| 388 | + ON fkc.referenced_column_id = c.column_id |
| 389 | + AND fkc.referenced_object_id = c.[object_id] |
| 390 | + WHERE fkc.constraint_object_id = fk.[object_id] |
| 391 | + ORDER BY fkc.constraint_column_id |
| 392 | + FOR XML PATH(N''), TYPE).value(N'.[1]', N'nvarchar(max)'), 1, 1, N'') + ');', |
| 393 | + cs.[Name] |
| 394 | + FROM sys.foreign_keys AS fk |
| 395 | + INNER JOIN sys.tables AS rt -- referenced table |
| 396 | + ON fk.referenced_object_id = rt.[object_id] |
| 397 | + INNER JOIN sys.schemas AS rs |
| 398 | + ON rt.[schema_id] = rs.[schema_id] |
| 399 | + INNER JOIN sys.tables AS ct -- constraint table |
| 400 | + ON fk.parent_object_id = ct.[object_id] |
| 401 | + INNER JOIN sys.schemas AS cs |
| 402 | + ON ct.[schema_id] = cs.[schema_id] |
| 403 | + WHERE rt.is_ms_shipped = 0 AND ct.is_ms_shipped = 0; |
| 404 | + |
| 405 | + --Need to pull User Defined Types |
| 406 | + |
| 407 | + --Pull User Defined Table Types |
| 408 | + IF OBJECT_ID('tempdb..#TableTypes') IS NOT NULL |
| 409 | + DROP TABLE #TableTypes; |
| 410 | + |
| 411 | + DECLARE @UdttName varchar(128), |
| 412 | + @UdtObjectId int |
| 413 | + |
| 414 | + SELECT |
| 415 | + t.[Name], |
| 416 | + Type_Table_Object_Id, |
| 417 | + isnull(sd.[name], 'dbo') as SchemaName |
| 418 | + INTO #TableTypes |
| 419 | + from sys.table_types t |
| 420 | + Left JOIN #SchemaData sd on t.schema_id = sd.schema_id |
| 421 | + |
| 422 | + WHILE EXISTS ( SELECT TOP 1 [Name] from #TableTypes) |
| 423 | + BEGIN |
| 424 | + |
| 425 | + SELECT TOP 1 @UdttName = [Name], |
| 426 | + @UdtObjectId = Type_Table_Object_Id, |
| 427 | + @SchemaName = SchemaName |
| 428 | + From #TableTypes |
| 429 | + |
| 430 | + SET @SQL = ''; |
| 431 | + SET @InsertCols = ''; |
| 432 | + |
| 433 | + IF OBJECT_ID('tempdb..#TTColumnData') IS NOT NULL |
| 434 | + DROP TABLE #TTColumnData; |
| 435 | + |
| 436 | + --Get a list of all the columns |
| 437 | + select |
| 438 | + col.[Name] As ColName, |
| 439 | + types.[name] as TypeName, |
| 440 | + col.[object_id], |
| 441 | + Col.[column_id], |
| 442 | + col.is_nullable, |
| 443 | + is_identity, |
| 444 | + is_computed, |
| 445 | + is_rowguidcol, |
| 446 | + col.max_length, |
| 447 | + col.[precision], |
| 448 | + col.scale |
| 449 | + INTO #TTColumnData |
| 450 | + from sys.columns col |
| 451 | + inner join sys.types types on col.user_type_id = types.user_type_id |
| 452 | + WHERE [object_id] = @UdtObjectId |
| 453 | + order by Column_id |
| 454 | + |
| 455 | + SET @FirstColumn = ' '; --This is used for toggling when to a comma in a series of fields |
| 456 | + |
| 457 | + While EXISTS (SELECT TOP 1 [ColName] FROM #TTColumnData) |
| 458 | + BEGIN |
| 459 | + --Reset Flags |
| 460 | + SELECT @ColNullable = 0, |
| 461 | + @ColIdentity = 0, |
| 462 | + @ColDefault = null |
| 463 | + |
| 464 | + --SELECT * FROM #TTColumnData |
| 465 | + |
| 466 | + SELECT TOP 1 @ColumnName = ColName |
| 467 | + ,@dataType = TypeName |
| 468 | + ,@ColNullable = is_nullable |
| 469 | + ,@ColIdentity = is_identity |
| 470 | + ,@ColId = column_id |
| 471 | + ,@ColObject = [object_id] |
| 472 | + ,@colMaxLength = max_length |
| 473 | + ,@colprecision = precision |
| 474 | + ,@colScale = scale |
| 475 | + ,@ColIsComputed = is_computed |
| 476 | + FROM #TTColumnData |
| 477 | + Order by column_id |
| 478 | + |
| 479 | + SET @SQL = @SQL + @FirstColumn + ' [' + @ColumnName + '] ' |
| 480 | + |
| 481 | + if @ColIsComputed = 0 |
| 482 | + BEGIN |
| 483 | + --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 |
| 484 | + SELECT @ColTextLength = CASE @ColMaxLength |
| 485 | + WHEN -1 THEN 'max' |
| 486 | + ELSE |
| 487 | + CASE WHEN @dataType = 'nvarchar' OR @dataType = 'nchar' THEN |
| 488 | + CONVERT(varchar(4),@ColMaxLength /2) |
| 489 | + ELSE |
| 490 | + CONVERT(varchar(4),@ColMaxLength) |
| 491 | + END |
| 492 | + END |
| 493 | + |
| 494 | + SET @SQL = @SQL + |
| 495 | + CASE @dataType |
| 496 | + WHEN 'varchar' THEN 'varchar(' + @ColTextLength + ')' |
| 497 | + WHEN 'char' THEN 'char(' + @ColTextLength + ')' |
| 498 | + WHEN 'nvarchar' THEN 'nvarchar(' + @ColTextLength + ')' |
| 499 | + WHEN 'nchar' THEN 'nchar(' + @ColTextLength + ')' |
| 500 | + WHEN 'decimal' then 'decimal(' + CONVERT(varchar(3), @colPrecision) + ',' + CONVERT(varchar(3), @colScale) + ')' |
| 501 | + WHEN 'numeric' then 'numeric(' + CONVERT(varchar(3), @colPrecision) + ',' + CONVERT(varchar(3), @colScale) + ')' |
| 502 | + ELSE @dataType |
| 503 | + END |
| 504 | + |
| 505 | + if @ColIdentity = 1 |
| 506 | + BEGIN |
| 507 | + SELECT @Seed = Convert(int, seed_value), @Increment = convert(int, increment_value) |
| 508 | + FROM sys.identity_columns |
| 509 | + WHERE [object_id] = @UdtObjectId AND [name] = @ColumnName |
| 510 | + |
| 511 | + SET @SQL = @SQL + ' IDENTITY(' + CONVERT(varchar(3), @Seed) + ',' + CONVERT(varchar(3),@Increment) + ') ' |
| 512 | + END |
| 513 | + |
| 514 | + if NOT @ColDefault IS NULL |
| 515 | + SET @SQL = @SQL + ' DEFAULT' + @ColDefault |
| 516 | + |
| 517 | + if @ColNullable = 0 |
| 518 | + SET @SQL = @SQL + ' NOT NULL ' |
| 519 | + END |
| 520 | + ELSE |
| 521 | + BEGIN |
| 522 | + SELECT @ColComputedDefintion = [definition] |
| 523 | + from sys.computed_columns |
| 524 | + where [OBJECT_ID] = @UdtObjectId |
| 525 | + and [column_id] = @ColId |
| 526 | + |
| 527 | + SET @SQL = @SQL + ' AS ' + @ColComputedDefintion |
| 528 | + END |
| 529 | + |
| 530 | + SET @FirstColumn = ','; |
| 531 | + |
| 532 | + DELETE FROM #TTColumnData WHERE ColName = @ColumnName; |
| 533 | + END |
| 534 | + |
| 535 | + INSERT INTO @Scripts |
| 536 | + ( |
| 537 | + ScriptType, |
| 538 | + TableName, |
| 539 | + SqlStatement, |
| 540 | + SchemaName |
| 541 | + ) |
| 542 | + VALUES |
| 543 | + ( |
| 544 | + 'UDTT', |
| 545 | + @UdttName, |
| 546 | + 'CREATE TYPE ' + @SchemaName + '.' + @UdttName + ' AS TABLE (' + @SQL + ')', |
| 547 | + @SchemaName |
| 548 | + ) |
| 549 | + |
| 550 | + DELETE FROM #TableTypes WHERE [name] = @UdttName |
| 551 | + END |
| 552 | + |
| 553 | + |
344 | 554 | --Functions
|
345 | 555 | INSERT INTO @Scripts
|
346 | 556 | (
|
|
356 | 566 | from sys.sql_modules m
|
357 | 567 | inner join sys.objects o on m.object_id = o.object_id
|
358 | 568 | WHERE o.[Type] in ('FN', 'IF', 'TF')
|
| 569 | + ORDER BY create_date asc |
359 | 570 |
|
360 | 571 | --Grab Procedures
|
361 | 572 | INSERT INTO @Scripts
|
|
369 | 580 | m.definition
|
370 | 581 | from sys.procedures p
|
371 | 582 | inner join sys.sql_modules m on p.object_id = m.object_id
|
| 583 | + ORDER BY create_date asc |
372 | 584 |
|
| 585 | + --Grab the Views |
373 | 586 | INSERT INTO @Scripts
|
374 | 587 | (
|
375 | 588 | ScriptType,
|
|
381 | 594 | m.definition
|
382 | 595 | from sys.views p
|
383 | 596 | inner join sys.sql_modules m on p.object_id = m.object_id
|
| 597 | + ORDER BY create_date asc |
384 | 598 |
|
385 | | - SELECT *, LEN(SqlStatement) AS StatementLength FROM @Scripts; |
386 | | - |
387 | | - |
| 599 | + SELECT *, LEN(SqlStatement) AS StatementLength |
| 600 | +FROM @Scripts |
| 601 | + |
0 commit comments