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 0e87f5b

Browse files
authored
Merge pull request #1 from Fortee2/Working
Working
2 parents 39d141e + 06c764f commit 0e87f5b

File tree

2 files changed

+216
-45
lines changed

2 files changed

+216
-45
lines changed

‎ExtractDB/Schema.sql

Lines changed: 214 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ DECLARE
1919
@ColPrecision int,
2020
@ColScale int,
2121
@ColTextLength varchar(5),
22+
@ColIsComputed bit,
23+
@ColComputedDefintion varchar(max),
2224
@Seed int,
2325
@Increment int,
2426
@FirstColumn char(1) = ' ',
@@ -28,6 +30,9 @@ DECLARE
2830
@ConstraintType varchar(2),
2931
--Variables for Indexes
3032
@IndexName varchar(128),
33+
@IndexType varchar(128),
34+
@IndexedColumns varchar(max),
35+
@IndexIncludedColumns varchar(max),
3136
--Variables for Data Migration
3237
@InsertCols varchar(max),
3338
@InsertSql nvarchar(max)
@@ -40,6 +45,14 @@ Declare @Scripts Table(
4045
SchemaName varchar(128)
4146
)
4247

48+
DECLARE @Indices Table
49+
(
50+
IndexName varchar(128),
51+
[IndexType] varchar(50),
52+
IndexedColumns varchar(Max),
53+
IncludedColumns varchar(max)
54+
)
55+
4356
--Base line everything by dropping any temp tables that are still around
4457
IF OBJECT_ID('tempdb..#tables') IS NOT NULL
4558
DROP TABLE #tables
@@ -78,18 +91,19 @@ order by create_date asc
7891

7992
While EXISTS (SELECT [Name] FROM #Tables)
8093
BEGIN
81-
SELECT TOP 1
94+
SELECT TOP 1
8295
@TableObjectId = [object_id],
8396
@TableName = [Name],
8497
@SchemaName = [SchemaName]
8598
FROM #tables;
86-
99+
87100
SET @SQL = '';
88101
SET @InsertCols = '';
89102

90103
IF OBJECT_ID('tempdb..#ColumnData') IS NOT NULL
91104
DROP TABLE #ColumnData;
92105

106+
--Get a list of all the columns
93107
select
94108
col.[Name] As ColName,
95109
types.[name] as TypeName,
@@ -107,8 +121,8 @@ BEGIN
107121
inner join sys.types types on col.user_type_id = types.user_type_id
108122
WHERE [object_id] = @TableObjectId
109123
order by Column_id
110-
111-
SET @FirstColumn = ' ';
124+
125+
SET @FirstColumn = ' ';--This is used for toggling when to a comma in a series of fields
112126

113127
While EXISTS (SELECT TOP 1 [ColName] FROM #ColumnData)
114128
BEGIN
@@ -126,53 +140,60 @@ BEGIN
126140
,@colMaxLength = max_length
127141
,@colprecision = precision
128142
,@colScale = scale
143+
,@ColIsComputed = is_computed
129144
FROM #ColumnData
130145
Order by column_id
131146

132-
--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
133-
SELECT @ColTextLength = CASE @ColMaxLength
134-
WHEN -1 THEN 'max'
135-
ELSE
136-
CASE WHEN @dataType = 'nvarchar' OR @dataType = 'nchar' THEN
137-
CONVERT(varchar(4),@ColMaxLength /2)
138-
ELSE
139-
CONVERT(varchar(4),@ColMaxLength)
140-
END
141-
END
142-
143-
SET @SQL = @SQL + @FirstColumn + ' ' + @ColumnName + ' ' +
144-
CASE @dataType
145-
WHEN 'varchar' THEN 'varchar(' + @ColTextLength + ')'
146-
WHEN 'char' THEN 'char(' + @ColTextLength + ')'
147-
WHEN 'nvarchar' THEN 'nvarchar(' + @ColTextLength + ')'
148-
WHEN 'nchar' THEN 'nchar(' + @ColTextLength + ')'
149-
WHEN 'decimal' then 'decimal(' + CONVERT(varchar(3), @colPrecision) + ',' + CONVERT(varchar(3), @colScale) + ')'
150-
WHEN 'numeric' then 'numeric(' + CONVERT(varchar(3), @colPrecision) + ',' + CONVERT(varchar(3), @colScale) + ')'
151-
ELSE @dataType
152-
END
153-
154-
if @ColIdentity = 1
147+
SET @SQL = @SQL + @FirstColumn + ' ' + @ColumnName + ' '
148+
149+
if @ColIsComputed = 0
155150
BEGIN
156-
SELECT @Seed = Convert(int, seed_value), @Increment = convert(int, increment_value)
157-
FROM sys.identity_columns
158-
WHERE [object_id] = @TableObjectId AND [name] = @ColumnName
151+
--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
152+
SELECT @ColTextLength = CASE @ColMaxLength
153+
WHEN -1 THEN 'max'
154+
ELSE
155+
CASE WHEN @dataType = 'nvarchar' OR @dataType = 'nchar' THEN
156+
CONVERT(varchar(4),@ColMaxLength /2)
157+
ELSE
158+
CONVERT(varchar(4),@ColMaxLength)
159+
END
160+
END
159161

160-
SET @SQL = @SQL + ' IDENTITY(' + CONVERT(varchar(3), @Seed) + ',' + CONVERT(varchar(3),@Increment) + ') '
161-
END
162+
SET @SQL = @SQL +
163+
CASE @dataType
164+
WHEN 'varchar' THEN 'varchar(' + @ColTextLength + ')'
165+
WHEN 'char' THEN 'char(' + @ColTextLength + ')'
166+
WHEN 'nvarchar' THEN 'nvarchar(' + @ColTextLength + ')'
167+
WHEN 'nchar' THEN 'nchar(' + @ColTextLength + ')'
168+
WHEN 'decimal' then 'decimal(' + CONVERT(varchar(3), @colPrecision) + ',' + CONVERT(varchar(3), @colScale) + ')'
169+
WHEN 'numeric' then 'numeric(' + CONVERT(varchar(3), @colPrecision) + ',' + CONVERT(varchar(3), @colScale) + ')'
170+
ELSE @dataType
171+
END
162172

163-
SELECT @ColDefault = d.definition
164-
FROM sys.default_constraints AS d
165-
WHERE d.parent_object_id = @ColObject
166-
AND d.parent_column_id = @ColId
173+
if @ColIdentity = 1
174+
BEGIN
175+
SELECT @Seed = Convert(int, seed_value), @Increment = convert(int, increment_value)
176+
FROM sys.identity_columns
177+
WHERE [object_id] = @TableObjectId AND [name] = @ColumnName
167178

168-
if NOT @ColDefault IS NULL
169-
SET @SQL = @SQL + ' DEFAULT' + @ColDefault
179+
SET @SQL = @SQL + ' IDENTITY(' + CONVERT(varchar(3), @Seed) + ',' + CONVERT(varchar(3),@Increment) + ') '
180+
END
181+
182+
if NOT @ColDefault IS NULL
183+
SET @SQL = @SQL + ' DEFAULT' + @ColDefault
170184

171-
if @ColNullable = 0
172-
SET @SQL = @SQL + ' NOT NULL '
185+
if @ColNullable = 0
186+
SET @SQL = @SQL + ' NOT NULL '
187+
END
188+
ELSE
189+
BEGIN
190+
SELECT @ColComputedDefintion = [definition]
191+
from sys.computed_columns
192+
where [OBJECT_ID] = @TableObjectId
193+
and [column_id] = @ColId
173194

174-
-- This code is for generating an insert statement
175-
SET @InsertCols = @InsertCols + @FirstColumn +' '+ @ColumnName +' ';
195+
SET @SQL = @SQL +' AS '+ @ColComputedDefintion
196+
END
176197

177198
SET @FirstColumn = ',';
178199

@@ -210,7 +231,157 @@ BEGIN
210231
@SchemaName
211232
)
212233

234+
INSERT INTO @Scripts
235+
(
236+
ScriptType,
237+
TableName,
238+
SqlStatement,
239+
SchemaName
240+
)
241+
select 'Trigger',
242+
@TableName,
243+
m.definition,
244+
@SchemaName
245+
from sys.sql_modules m
246+
inner join sys.objects o on m.object_id = o.object_id
247+
WHERE o.parent_object_id = @TableObjectId
248+
and o.[Type] = 'TR'
249+
250+
251+
--Add in the indexes
252+
INSERT INTO @Indices
253+
(
254+
IndexName,
255+
[IndexType],
256+
IndexedColumns,
257+
IncludedColumns
258+
)
259+
SELECT
260+
i.NAME AS 'IndexName'
261+
,LOWER(i.type_desc) + CASE
262+
WHEN i.is_unique = 1
263+
THEN ', unique'
264+
ELSE ''
265+
END + CASE
266+
WHEN i.is_primary_key = 1
267+
THEN ', primary key'
268+
ELSE ''
269+
END AS [IndexType]
270+
,STUFF((
271+
SELECT ', [' + sc.NAME + ']' AS "text()"
272+
FROM syscolumns AS sc
273+
INNER JOIN sys.index_columns AS ic ON ic.object_id = sc.id
274+
AND ic.column_id = sc.colid
275+
WHERE sc.id = so.object_id
276+
AND ic.index_id = i1.indid
277+
AND ic.is_included_column = 0
278+
ORDER BY key_ordinal
279+
FOR XML PATH('')
280+
), 1, 2, '') AS 'IndexedColumns'
281+
,STUFF((
282+
SELECT ', [' + sc.NAME + ']' AS "text()"
283+
FROM syscolumns AS sc
284+
INNER JOIN sys.index_columns AS ic ON ic.object_id = sc.id
285+
AND ic.column_id = sc.colid
286+
WHERE sc.id = so.object_id
287+
AND ic.index_id = i1.indid
288+
AND ic.is_included_column = 1
289+
FOR XML PATH('')
290+
), 1, 2, '') AS 'included_columns'
291+
FROM sysindexes AS i1
292+
INNER JOIN sys.indexes AS i ON i.object_id = i1.id
293+
AND i.index_id = i1.indid
294+
INNER JOIN sysobjects AS o ON o.id = i1.id
295+
INNER JOIN sys.objects AS so ON so.object_id = o.id
296+
AND is_ms_shipped = 0
297+
INNER JOIN sys.schemas AS s ON s.schema_id = so.schema_id
298+
WHERE so.type = 'U'
299+
AND i.is_primary_key = 0 --don't want the primary key and unique constraints
300+
AND i.is_unique = 0
301+
AND i1.indid < 255
302+
AND i1.STATUS & 64 = 0 --index with duplicates
303+
AND i1.STATUS & 8388608 = 0 --auto created index
304+
AND i1.STATUS & 16777216 = 0 --stats no recompute
305+
AND i.type_desc <> 'heap'
306+
AND so.NAME <> 'sysdiagrams'
307+
AND o.id = @TableObjectId
308+
309+
WHILE Exists( SELECT top 1 IndexName FROM @Indices)
310+
BEGIN
311+
SELECT TOP 1
312+
@IndexName = IndexName,
313+
@IndexedColumns = IndexedColumns,
314+
@IndexType = IndexType,
315+
@IndexIncludedColumns = IncludedColumns
316+
FROM @Indices
317+
318+
SET @SQL = 'CREATE ' + @IndexType + ' INDEX ' + @IndexName + ' ON ' + @SchemaName + '.' + @TableName + ' ( ' + @IndexedColumns + ') '
319+
320+
if not @IndexIncludedColumns is null
321+
BEGIN
322+
SET @SQL = @SQL + 'INCLUDE (' + @IndexIncludedColumns + ')'
323+
END
324+
325+
INSERT INTO @Scripts
326+
(
327+
ScriptType,
328+
TableName,
329+
SqlStatement,
330+
SchemaName
331+
)
332+
VALUES
333+
(
334+
'Index',
335+
@TableName,
336+
@SQL,
337+
@SchemaName
338+
)
339+
DELETE FROM @Indices WHERE IndexName = @IndexName
340+
END
341+
213342
DELETE FROM #tables WHERE [object_id] = @TableObjectId
214343
END
344+
--Functions
345+
INSERT INTO @Scripts
346+
(
347+
ScriptType,
348+
TableName,
349+
SqlStatement,
350+
SchemaName
351+
)
352+
select 'Functions',
353+
o.[Name],
354+
m.definition,
355+
@SchemaName
356+
from sys.sql_modules m
357+
inner join sys.objects o on m.object_id = o.object_id
358+
WHERE o.[Type] in ('FN', 'IF', 'TF')
359+
360+
--Grab Procedures
361+
INSERT INTO @Scripts
362+
(
363+
ScriptType,
364+
TableName,
365+
SqlStatement
366+
)
367+
select 'Procedures',
368+
p.name,
369+
m.definition
370+
from sys.procedures p
371+
inner join sys.sql_modules m on p.object_id = m.object_id
372+
373+
INSERT INTO @Scripts
374+
(
375+
ScriptType,
376+
TableName,
377+
SqlStatement
378+
)
379+
select 'Views',
380+
p.name,
381+
m.definition
382+
from sys.views p
383+
inner join sys.sql_modules m on p.object_id = m.object_id
384+
385+
SELECT *, LEN(SqlStatement) AS StatementLength FROM @Scripts;
386+
215387

216-
SELECT * FROM @Scripts;

‎Powershell/CopyDatabase.ps1

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ foreach($sql in $DS.Tables[0].Rows){
2727
Invoke-Expression $bcp
2828
Write-Output $bcp
2929

30-
$bcp = "bcp $($sql.SchemaName).$($sql.TableName) out $($tempPath)$($sql.TableName).bcp -S $($ServerName) -d $($SourceDatabase) -U $($UserName) -P $($Password) -E -n -t -e $($logPath)$($sql.TableName)_in_err.txt"
30+
$bcp = "bcp $($sql.SchemaName).$($sql.TableName) out $($tempPath)$($sql.TableName).bcp -S $($ServerName) -d $($SourceDatabase) -U $($UserName) -P $($Password) -E -n -t -e $($logPath)$($sql.TableName)_out_err.txt"
3131
Invoke-Expression $bcp
3232
Write-Output $bcp
3333

3434
#add code to import in to use format file
35-
$bcp = "bcp $($sql.SchemaName).$($sql.TableName) in $($tempPath)$($sql.TableName).bcp -S $($DestinationServer) -d $($DestinationDB) -T -t -E -f $($tempPath)$($sql.TableName).fmt -e $($logPath)$($sql.TableName)_out_err.txt"
35+
$bcp = "bcp $($sql.SchemaName).$($sql.TableName) in $($tempPath)$($sql.TableName).bcp -S $($DestinationServer) -d $($DestinationDB) -T -t -E -f $($tempPath)$($sql.TableName).fmt -e $($logPath)$($sql.TableName)_in_err.txt"
3636
Invoke-Expression $bcp
3737
Write-Output $bcp
3838

0 commit comments

Comments
(0)

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