-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path2-Fields.sql
More file actions
298 lines (274 loc) · 11.5 KB
/
2-Fields.sql
File metadata and controls
298 lines (274 loc) · 11.5 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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
--======================================= 2. Field =======================================
/*
This file holds the query for copying the structure of fields of tables in reference database to the destination database
To execute this, you need to replace "{Base}" with your reference database name
and replace "{Destination}" with your destination database name
This query creates a table called "#TempBase" in tempdb, so you need access to do that.
The query contains different parts like "adding new field", "updating current fields" and
"updating current fields with contraints".
*/
--********** 2.1 Add Field
Begin /*AddField*/
If Object_ID ('tempdb.dbo.#TempBase', 'U') Is Not Null Drop Table #TempBase;
If Object_ID ('tempdb.dbo.#TempDestination', 'U') Is Not Null Drop Table #TempDestination;
Select *
Into #TempBase
From {Base}.INFORMATION_SCHEMA.COLUMNS
Select *
Into #TempDestination
From {Destination}.INFORMATION_SCHEMA.COLUMNS
Select Distinct TABLE_NAME,COLUMN_NAME
From #TempBase
EXCEPT
Select Distinct TABLE_NAME,COLUMN_NAME
From #TempDestination
Declare @tablenameAF nvarchar(50)
Declare @COLUMN_NAMEAF nvarchar(50)
Declare @rowAF int
Set @rowAF = 0
Declare cursor_AddFields Cursor For
Select Distinct TABLE_NAME,COLUMN_NAME
From #TempBase
Except
Select Distinct TABLE_NAME,COLUMN_NAME
From #TempDestination
Open cursor_AddFields
Fetch From cursor_AddFields
Into @tablenameAF,@COLUMN_NAMEAF
While @@Fetch_STATUS=0
Begin
Declare @table_nameAF SYSNAME
Select @table_nameAF ='dbo.'+ @tablenameAF
Declare @AddFields NVARCHAR(MAX) = ''
Select @AddFields =
'ALTER TABLE ' +
@table_nameAF + CHAR(13) + 'ADD ' +
STUFF((
Select CHAR(9) + ', [' + c.COLUMN_NAME + '] ' +
Upper(c.DATA_TYPE) +
Case
When c.DATA_TYPE In ('varchar', 'char', 'varbinary', 'binary', 'text','nvarchar', 'nchar', 'ntext')
Then '(' + Case When c.CHARACTER_MAXIMUM_LENGTH = -1 Then 'MAX' Else CAST(c.CHARACTER_MAXIMUM_LENGTH AS VARCHAR(50)) END + ')'
When c.DATA_TYPE IN ('datetime2', 'time2', 'datetimeoffset')
Then '(' + CAST(c.NUMERIC_SCALE AS VARCHAR(50)) + ')'
When c.DATA_TYPE = 'decimal'
Then '(' + CAST(c.NUMERIC_PRECISION AS VARCHAR(50)) + ',' + CAST(c.NUMERIC_SCALE AS VARCHAR(50)) + ')'
Else ''
END +
Case
When c.COLLATION_NAME Is Not Null Then ' Collate ' + c.COLLATION_NAME
Else ''
END +
Case
When c.IS_NULLABLE = 'YES' Then ' NULL'
Else ' NOT NULL'
END +
Case
When c.COLUMN_DEFAULT Is Not Null Then ' DEFAULT' + c.COLUMN_DEFAULT
Else ''
END
+ CHAR(13)
From #TempBase as c
Where c.TABLE_NAME = @tablenameAF And
c.COLUMN_NAME=@COLUMN_NAMEAF
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, CHAR(9) + ' ')
PRINT @AddFields
--EXEC sys.sp_executesql @SQL
Fetch Next From cursor_AddFields
Into @tablenameAF,@COLUMN_NAMEAF
End
Close cursor_AddFields
Deallocate cursor_AddFields
End /*AddField*/
--********** 2.2 Update Filed
Begin /*UpdateField*/
If Object_ID ('tempdb.dbo.#TempBase', 'U') Is Not Null Drop Table #TempBase;
If Object_ID ('tempdb.dbo.#TempDestination', 'U') Is Not Null Drop Table #TempDestination;
Select *
Into #TempBase
From {Base}.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME+COLUMN_NAME not in (Select TABLE_NAME+COLUMN_NAME
From {Base}.INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
union
Select t.name+col.name
From {Base}.sys.indexes ind Inner Join
{Base}.sys.index_columns ic On ind.object_id = ic.object_id and ind.index_id = ic.index_id Inner Join
{Base}.sys.columns col On ic.object_id = col.object_id and ic.column_id = col.column_id Inner Join
{Base}.sys.tables t On ind.object_id = t.object_id
Where ind.is_primary_key = 0 And
ind.is_unique = 0 And
ind.is_unique_constraint = 0 And
t.is_ms_shipped = 0 )
Select *
Into #TempDestination
From {Destination}.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME+COLUMN_NAME not in (Select TABLE_NAME+COLUMN_NAME
From {Destination}.INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
union
Select t.name+col.name
From {Destination}.sys.indexes ind Inner Join
{Destination}.sys.index_columns ic On ind.object_id = ic.object_id and ind.index_id = ic.index_id Inner Join
{Destination}.sys.columns col On ic.object_id = col.object_id and ic.column_id = col.column_id Inner Join
{Destination}.sys.tables t On ind.object_id = t.object_id
Where ind.is_primary_key = 0 And
ind.is_unique = 0 And
ind.is_unique_constraint = 0 And
t.is_ms_shipped = 0 )
Select Distinct TABLE_NAME, COLUMN_NAME, COLUMN_DEFAULT, IS_NULLABLE,DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_PRECISION_RADIX
From #TempBase
Except
Select Distinct TABLE_NAME, COLUMN_NAME, COLUMN_DEFAULT, IS_NULLABLE,DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_PRECISION_RADIX
From #TempDestination
Declare @tablenameUF nvarchar(50)
Declare @COLUMN_NAMEUF nvarchar(50)
Declare @COLUMN_DEFAULTUF nvarchar(50)
Declare @IS_NULLABLEUF nvarchar(50)
Declare @DATA_TYPEUF nvarchar(50)
Declare @CHARACTER_MAXIMUM_LENGTHUF nvarchar(50)
Declare @NUMERIC_PRECISIONUF nvarchar(50)
Declare @NUMERIC_PRECISION_RADIXUF nvarchar(50)
Declare @rowUF int
Set @rowUF = 0
Declare cursor_UpdateFields
Cursor For
Select Distinct TABLE_NAME,COLUMN_NAME,COLUMN_DEFAULT,IS_NULLABLE,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_PRECISION_RADIX
From #TempBase
Except
Select Distinct TABLE_NAME,COLUMN_NAME,COLUMN_DEFAULT,IS_NULLABLE,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_PRECISION_RADIX
From #TempDestination
Open cursor_UpdateFields
Fetch From cursor_UpdateFields
Into @tablenameUF,@COLUMN_NAMEUF,@COLUMN_DEFAULTUF,@IS_NULLABLEUF,@DATA_TYPEUF,@CHARACTER_MAXIMUM_LENGTHUF,@NUMERIC_PRECISIONUF,@NUMERIC_PRECISION_RADIXUF
While @@Fetch_STATUS=0
Begin
Declare @table_nameUF SYSNAME
Select @table_nameUF ='dbo.'+ @tablenameUF
Declare @UpdateFields NVARCHAR(MAX) = ''
Select @UpdateFields =
'ALTER TABLE ' + @table_nameUF + CHAR(13) + 'ALTER COLUMN ' +
STUFF((
Select CHAR(9) + ', [' + c.COLUMN_NAME + '] ' +
Case
When 0 = 1 Then 'AS ' + c.COLUMN_NAME
Else Upper(c.DATA_TYPE) +
Case
When c.DATA_TYPE IN ('varchar', 'char', 'varbinary', 'binary', 'text','nvarchar', 'nchar', 'ntext')
Then '(' + Case When c.CHARACTER_MAXIMUM_LENGTH = -1 Then 'MAX' Else CAST(c.CHARACTER_MAXIMUM_LENGTH AS VARCHAR(5)) END + ')'
When c.DATA_TYPE IN ('datetime2', 'time2', 'datetimeoffset')
Then '(' + CAST(c.NUMERIC_SCALE AS VARCHAR(5)) + ')'
When c.DATA_TYPE = 'decimal'
Then '(' + CAST(c.NUMERIC_PRECISION AS VARCHAR(5)) + ',' + CAST(c.NUMERIC_SCALE AS VARCHAR(5)) + ')'
Else ''
END +
Case
When c.COLLATION_NAME IS NOT NULL Then ' Collate ' + c.COLLATION_NAME
Else ''
END +
Case
When c.IS_NULLABLE = 'YES' Then ' NULL'
Else ' NOT NULL'
END +
Case
When c.COLUMN_DEFAULT IS NOT NULL Then ' DEFAULT' + c.COLUMN_DEFAULT
Else ''
END
END + CHAR(13)
From #TempBase As c
Where c.TABLE_NAME = @tablenameUF And
c.COLUMN_NAME=@COLUMN_NAMEUF
--And c.COLUMN_DEFAULT=@COLUMN_DEFAULTUF
--And c.DATA_TYPE=@DATA_TYPEUF
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, CHAR(9) + ' ')
PRINT @UpdateFields
--EXEC sys.sp_executesql @SQL
Fetch Next From cursor_UpdateFields
Into @tablenameUF,@COLUMN_NAMEUF,@COLUMN_DEFAULTUF,@IS_NULLABLEUF,@DATA_TYPEUF,@CHARACTER_MAXIMUM_LENGTHUF,@NUMERIC_PRECISIONUF,@NUMERIC_PRECISION_RADIXUF
END
Close cursor_UpdateFields
Deallocate cursor_UpdateFields
end /*UpdateField*/
--********** 2.3 UpdateField_CONSTRAINT
Begin /*UpdateField_CONSTRAINT*/
If Object_ID ('tempdb.dbo.#TempBase', 'U') Is Not Null Drop Table #TempBase;
If Object_ID ('tempdb.dbo.#TempDestination', 'U') Is Not Null Drop Table #TempDestination;
Select *
Into #TempBase
From {Base}.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME+COLUMN_NAME in (Select TABLE_NAME+COLUMN_NAME
From {Base}.INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
union
Select t.name+col.name
From {Base}.sys.indexes ind Inner Join
{Base}.sys.index_columns ic On ind.object_id = ic.object_id and ind.index_id = ic.index_id Inner Join
{Base}.sys.columns col On ic.object_id = col.object_id and ic.column_id = col.column_id Inner Join
{Base}.sys.tables t On ind.object_id = t.object_id
Where ind.is_primary_key = 0 And
ind.is_unique = 0 And
ind.is_unique_constraint = 0 And
t.is_ms_shipped = 0 )
Select *
Into #TempDestination
From {Destination}.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME+COLUMN_NAME in (Select TABLE_NAME+COLUMN_NAME
From {Destination}.INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
union
Select t.name+col.name
From {Destination}.sys.indexes ind Inner Join
{Destination}.sys.index_columns ic On ind.object_id = ic.object_id and ind.index_id = ic.index_id Inner Join
{Destination}.sys.columns col On ic.object_id = col.object_id and ic.column_id = col.column_id Inner Join
{Destination}.sys.tables t On ind.object_id = t.object_id
Where ind.is_primary_key = 0 And
ind.is_unique = 0 And
ind.is_unique_constraint = 0 And
t.is_ms_shipped = 0 )
Select Distinct TABLE_NAME, COLUMN_NAME, COLUMN_DEFAULT, IS_NULLABLE,DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_PRECISION_RADIX
From #TempBase
Except
Select Distinct TABLE_NAME, COLUMN_NAME, COLUMN_DEFAULT, IS_NULLABLE,DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_PRECISION_RADIX
From #TempDestination
Declare @tablenameUF_c nvarchar(50)
Declare @COLUMN_NAMEUF_c nvarchar(50)
Declare @COLUMN_DEFAULTUF_c nvarchar(50)
Declare @IS_NULLABLEUF_c nvarchar(50)
Declare @DATA_TYPEUF_c nvarchar(50)
Declare @CHARACTER_MAXIMUM_LENGTHUF_c nvarchar(50)
Declare @NUMERIC_PRECISIONUF_c nvarchar(50)
Declare @NUMERIC_PRECISION_RADIXUF_c nvarchar(50)
Declare @rowUF_c int
Set @rowUF_c = 0
Declare cursor_UpdateFields_c
Cursor For
Select Distinct TABLE_NAME,COLUMN_NAME,COLUMN_DEFAULT,IS_NULLABLE,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_PRECISION_RADIX
From #TempBase
Except
Select Distinct TABLE_NAME,COLUMN_NAME,COLUMN_DEFAULT,IS_NULLABLE,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_PRECISION_RADIX
From #TempDestination
Open cursor_UpdateFields_c
Fetch From cursor_UpdateFields_c
Into @tablenameUF_c,@COLUMN_NAMEUF_c,@COLUMN_DEFAULTUF_c,@IS_NULLABLEUF_c,@DATA_TYPEUF_c,@CHARACTER_MAXIMUM_LENGTHUF_c,@NUMERIC_PRECISIONUF_c,@NUMERIC_PRECISION_RADIXUF_c
While @@Fetch_STATUS=0
Begin
Declare @table_nameUF_c SYSNAME
Select @table_nameUF_c ='dbo.'+ @tablenameUF_c
Declare @UpdateFields_c NVARCHAR(MAX) = ''
Select @UpdateFields_c =@tablenameUF_c+char(13)+
STUFF((
Select char(13)+ ', [' + c.COLUMN_NAME + '] ' + CHAR(13)
From #TempBase As c
Where c.TABLE_NAME = @tablenameUF_c And
c.COLUMN_NAME=@COLUMN_NAMEUF_c
--And c.COLUMN_DEFAULT=@COLUMN_DEFAULTUF
--And c.DATA_TYPE=@DATA_TYPEUF
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, CHAR(20) + ' ')
PRINT @UpdateFields_c
--EXEC sys.sp_executesql @SQL
Fetch Next From cursor_UpdateFields_c
Into @tablenameUF_c,@COLUMN_NAMEUF_c,@COLUMN_DEFAULTUF_c,@IS_NULLABLEUF_c,@DATA_TYPEUF_c,@CHARACTER_MAXIMUM_LENGTHUF_c,@NUMERIC_PRECISIONUF_c,@NUMERIC_PRECISION_RADIXUF_c
END
Close cursor_UpdateFields_c
Deallocate cursor_UpdateFields_c
end /*UpdateField_CONSTRAINT*/