-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathsql2puml.sql
More file actions
144 lines (128 loc) · 4.68 KB
/
sql2puml.sql
File metadata and controls
144 lines (128 loc) · 4.68 KB
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
DECLARE @OBJ_DBNAME VARCHAR(100) = 'pubs'
DECLARE @LINECTRL INTEGER
DECLARE @OUTTBL AS TABLE (
LINECTRL INTEGER,
HEADERTRAILER VARCHAR(200),
TABLE_NAME VARCHAR(200),
MANDATORY VARCHAR(10),
NAME VARCHAR(200),
DATATYPE VARCHAR(200),
PRIMARY_KEY VARCHAR(4)
)
SET @LINECTRL = 1
INSERT INTO @OUTTBL VALUES(0, CONCAT('@startuml ', @OBJ_DBNAME), '', '', '', '', '')
DECLARE @mytbl AS TABLE(TABLE_NAME VARCHAR(500))
INSERT INTO @mytbl
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG=@OBJ_DBNAME
GROUP BY TABLE_NAME
WHILE((SELECT COUNT(*) FROM @mytbl)>0)
BEGIN
DECLARE @TBLNAME VARCHAR(200)
SELECT TOP 1 @TBLNAME = TABLE_NAME
FROM @mytbl
GROUP BY TABLE_NAME
INSERT INTO @OUTTBL VALUES(@LINECTRL, CONCAT('entity "', @TBLNAME, '" as ', @TBLNAME, ' {'), '', '', '', '', '')
SET @LINECTRL = @LINECTRL+3
INSERT INTO @OUTTBL
SELECT @LINECTRL,
'',
cols.TABLE_NAME,
(CASE when is_nullable = 'YES'
then ''
else '*'
end) AS MANDATORY,
cols.COLUMN_NAME AS NAME,
CONVERT(varchar, DATA_TYPE) +
(case when ISNULL(cols.CHARACTER_MAXIMUM_LENGTH,-1)=-1
then ''
else '('+CONVERT(varchar, cols.CHARACTER_MAXIMUM_LENGTH)+')'
end) AS DATATYPE,
(CASE WHEN EXISTS(
SELECT *
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu
ON tc.CONSTRAINT_NAME = ccu.Constraint_name
WHERE
tc.TABLE_NAME = cols.TABLE_NAME AND
tc.CONSTRAINT_TYPE = 'PRIMARY KEY' AND
ccu.COLUMN_NAME = cols.COLUMN_NAME
)
THEN '(PK)'
ELSE ''
END
) AS PRIMARY_KEY
FROM INFORMATION_SCHEMA.COLUMNS cols
WHERE cols.TABLE_CATALOG=@OBJ_DBNAME and cols.TABLE_NAME=@TBLNAME
SET @LINECTRL = @LINECTRL+3
INSERT INTO @OUTTBL VALUES(@LINECTRL, '}', '', '', '', '', '')
DELETE TOP(1) FROM @mytbl
END
UPDATE OT
SET OT.LINECTRL=OT.LINECTRL-2
FROM @OUTTBL OT
WHERE PRIMARY_KEY='(PK)'
INSERT INTO @OUTTBL
SELECT DISTINCT LINECTRL+1, '', TABLE_NAME, '', '--', '', ''
FROM @OUTTBL WHERE PRIMARY_KEY='(PK)'
SET @LINECTRL = @LINECTRL+3
INSERT INTO @OUTTBL
SELECT
@LINECTRL,
CONCAT(
tp.name,
(CASE WHEN EXISTS(
SELECT *
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu
ON tc.CONSTRAINT_NAME = ccu.Constraint_name
WHERE
tc.TABLE_NAME = tp.name AND
tc.CONSTRAINT_TYPE = 'PRIMARY KEY' AND
ccu.COLUMN_NAME = cp.name
)
THEN ' ||'
ELSE ' }o'
END
),
'..',
(CASE WHEN EXISTS(
SELECT *
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu
ON tc.CONSTRAINT_NAME = ccu.Constraint_name
WHERE
tc.TABLE_NAME = tr.name AND
tc.CONSTRAINT_TYPE = 'PRIMARY KEY' AND
ccu.COLUMN_NAME = cr.name
)
THEN '|| '
ELSE 'o{ '
END
),
tr.name,
' : ',
cp.name,
' = ',
cr.name),
'', '', '', '', ''
FROM sys.foreign_keys fk
INNER JOIN sys.tables tp ON fk.parent_object_id = tp.object_id
INNER JOIN sys.tables tr ON fk.referenced_object_id = tr.object_id
INNER JOIN sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id
INNER JOIN sys.columns cp ON fkc.parent_column_id = cp.column_id AND fkc.parent_object_id = cp.object_id
INNER JOIN sys.columns cr ON fkc.referenced_column_id = cr.column_id AND fkc.referenced_object_id = cr.object_id
ORDER BY tp.name, cp.column_id
SET @LINECTRL = @LINECTRL+3
INSERT INTO @OUTTBL VALUES(@LINECTRL, '@enduml', '', '', '', '', '')
SELECT CONCAT(
HEADERTRAILER,
CASE WHEN (DATATYPE <> '' OR NAME = '--') THEN CHAR(9) ELSE '' END,
MANDATORY,
CASE WHEN DATATYPE <> '' THEN ' ' ELSE '' END,
NAME,
CASE WHEN DATATYPE <> '' THEN ' : ' ELSE '' END,
DATATYPE
)
FROM @OUTTBL ORDER BY LINECTRL, TABLE_NAME ASC, PRIMARY_KEY DESC