Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 973d905

Browse files
committed
Adds Foreign Key Constraints, Adds brackets around column names when creating tables Adds User Defined Table Types, Ordes object creation by create_date to try to fix issues with object dependencies
1 parent 6955a2c commit 973d905

File tree

1 file changed

+221
-7
lines changed

1 file changed

+221
-7
lines changed

‎ExtractDB/Schema.sql

Lines changed: 221 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
DECLARE
22
--Variables for execution control
3-
@DropAndRecreate bit = 1,
3+
@DropAndRecreate bit = 0,
44
@SQL varchar(max),
55
--Variables for Schemas
66
@SchemaName varchar(128),
@@ -144,7 +144,7 @@ BEGIN
144144
FROM #ColumnData
145145
Order by column_id
146146

147-
SET @SQL = @SQL + @FirstColumn + ' ' + @ColumnName + ' '
147+
SET @SQL = @SQL + @FirstColumn + ' [' + @ColumnName + '] '
148148

149149
if @ColIsComputed = 0
150150
BEGIN
@@ -200,7 +200,22 @@ BEGIN
200200
DELETE FROM #ColumnData WHERE ColName = @ColumnName;
201201
END
202202

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

205220
IF @DropAndRecreate = 1
206221
INSERT INTO @Scripts
@@ -247,7 +262,6 @@ BEGIN
247262
WHERE o.parent_object_id = @TableObjectId
248263
and o.[Type] = 'TR'
249264

250-
251265
--Add in the indexes
252266
INSERT INTO @Indices
253267
(
@@ -304,6 +318,7 @@ BEGIN
304318
AND i1.STATUS & 16777216 = 0 --stats no recompute
305319
AND i.type_desc <> 'heap'
306320
AND so.NAME <> 'sysdiagrams'
321+
AND i.type_desc <> 'clustered'
307322
AND o.id = @TableObjectId
308323

309324
WHILE Exists( SELECT top 1 IndexName FROM @Indices)
@@ -341,6 +356,201 @@ BEGIN
341356

342357
DELETE FROM #tables WHERE [object_id] = @TableObjectId
343358
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+
344554
--Functions
345555
INSERT INTO @Scripts
346556
(
@@ -356,6 +566,7 @@ END
356566
from sys.sql_modules m
357567
inner join sys.objects o on m.object_id = o.object_id
358568
WHERE o.[Type] in ('FN', 'IF', 'TF')
569+
ORDER BY create_date asc
359570

360571
--Grab Procedures
361572
INSERT INTO @Scripts
@@ -369,7 +580,9 @@ END
369580
m.definition
370581
from sys.procedures p
371582
inner join sys.sql_modules m on p.object_id = m.object_id
583+
ORDER BY create_date asc
372584

585+
--Grab the Views
373586
INSERT INTO @Scripts
374587
(
375588
ScriptType,
@@ -381,7 +594,8 @@ END
381594
m.definition
382595
from sys.views p
383596
inner join sys.sql_modules m on p.object_id = m.object_id
597+
ORDER BY create_date asc
384598

385-
SELECT *, LEN(SqlStatement) AS StatementLength FROM @Scripts;
386-
387-
599+
SELECT *, LEN(SqlStatement) AS StatementLength
600+
FROM @Scripts
601+

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /