-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathJSON2SQL.sql
More file actions
111 lines (90 loc) · 2.62 KB
/
JSON2SQL.sql
File metadata and controls
111 lines (90 loc) · 2.62 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
CREATE DATABASE crec;
USE crec;
DECLARE @JSON varchar(max);
SELECT @JSON = BulkColumn
FROM OPENROWSET (BULK 'C:\ludo\diagrams\test-lola-diagdata.json', SINGLE_CLOB) import;
SELECT box, boxComment
FROM OPENJSON(@JSON, '$.boxComments') WITH (
box varchar(60) '$.box',
boxComment varchar(500) '$.comment'
)
SELECT box, field, fieldComment
FROM OPENJSON(@JSON, '$.fieldComments') WITH (
box varchar(60) '$.box',
field varchar(60) '$.field',
fieldComment varchar(500) '$.comment'
)
SELECT box, field, color
FROM OPENJSON(@JSON, '$.fieldColors') WITH (
box varchar(60) '$.box',
field varchar(60) '$.field',
color varchar(20) '$.color'
)
DROP TABLE IF EXISTS #box_staging;
SELECT boxtitle, boxid, fieldname, fieldIsPrimaryKey, fieldIsForeignKey, ROW_NUMBER() OVER(PARTITION BY boxid ORDER BY (SELECT NULL)) AS field_position
INTO #box_staging
FROM OPENJSON(@JSON, '$.boxes') WITH (
[boxtitle] varchar(60) '$.title',
[boxid] int '$.id',
[fields] nvarchar(max) '$.fields' AS JSON
) AS a
CROSS APPLY OPENJSON(a.fields) WITH (
[fieldname] varchar(60) '$.name',
[fieldIsPrimaryKey] BIT '$.isPrimaryKey',
[fieldIsForeignKey] BIT '$.isForeignKey'
)
SELECT * FROM #box_staging;
DROP TABLE IF EXISTS boxes;
CREATE TABLE boxes(
id INTEGER PRIMARY KEY CLUSTERED,
title VARCHAR(60) UNIQUE,
soft_deleled BIT
);
DROP TABLE IF EXISTS #boxes;
CREATE TABLE #boxes(
id INTEGER PRIMARY KEY CLUSTERED,
title VARCHAR(60) UNIQUE,
);
DROP TABLE IF EXISTS fields;
CREATE TABLE fields(
id INTEGER PRIMARY KEY CLUSTERED,
boxid INTEGER,
field_position INTEGER,-- position of field in box.fields array
[name] VARCHAR(60),
isPrimaryKey BIT,
isForeignKey BIT,
soft_deleted BIT,
UNIQUE(boxid, [name]),
UNIQUE(boxid, field_position),
FOREIGN KEY (boxid) REFERENCES boxes(id)
);
DROP TABLE IF EXISTS #fields;
CREATE TABLE #fields(
id INTEGER PRIMARY KEY CLUSTERED,
boxid INTEGER,
field_position INTEGER,-- position of field in box.fields array
[name] VARCHAR(60),
isPrimaryKey BIT,
isForeignKey BIT,
UNIQUE(boxid, [name]),
UNIQUE(boxid, field_position),
FOREIGN KEY (boxid) REFERENCES #boxes(id)
);
WITH cte AS (
SELECT DISTINCT boxid, boxtitle
FROM #box_staging
)
INSERT INTO #boxes(id, title)
SELECT boxid, boxtitle
FROM cte
ORDER BY boxid;
INSERT INTO #fields(id, boxid, field_position, [name], isPrimaryKey, isForeignKey)
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS id,
boxid,
field_position,
fieldname,
fieldIsPrimaryKey,
fieldIsForeignKey
FROM #box_staging
ORDER BY boxid, field_position;
SELECT * FROM boxes ORDER BY id;