forked from MichelleUfford/sql-scripts
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinsert_statement_generator.sql
More file actions
145 lines (117 loc) · 6.6 KB
/
insert_statement_generator.sql
File metadata and controls
145 lines (117 loc) · 6.6 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
/**********************************************************************************************************
NAME: insert_statement_generator.sql
SYNOPSIS: Generates insert statements for Teradata using SQL Server metadata.
This is useful for easily migrating small tables (i.e. < 1000 rows)
from SQL Server to Teradata. DO NOT use on large tables.
DEPENDENCIES: The following dependencies are required to execute this script:
- SQL Server 2005 or newer
AUTHOR: Michelle Ufford, http://sqlfool.com
CREATED: 2012-07-26
VERSION: 1.0
LICENSE: Apache License v2
----------------------------------------------------------------------------
DISCLAIMER:
This code and information are provided "AS IS" without warranty of any kind,
either expressed or implied, including but not limited to the implied
warranties or merchantability and/or fitness for a particular purpose.
----------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------
-- DATE VERSION AUTHOR DESCRIPTION --
---------------------------------------------------------------------------------------------------------
20150619 1.0 Michelle Ufford Open Sourced on GitHub
**********************************************************************************************************/
-- User-defined variables --
DECLARE
@tableName NVARCHAR(128) = 'dbo.example_table'
, @Top VARCHAR(10) = 1000 -- Leave NULL for all rows
, @Execute BIT = 1
, @GenerateSchema BIT = 1
, @GenerateTruncate BIT = 1
, @TeradataDatabase VARCHAR(30) = 'mufford'
, @TeradataTable VARCHAR(30) = NULL -- Will generate if you leave NULL
-- Script-defined variables --
DECLARE @columnList TABLE (columnID INT);
DECLARE @TeradataTableName VARCHAR(60);
IF @TeradataTable IS NULL
SET @TeradataTableName = @TeradataDatabase + '.tmp_' + SUBSTRING(@tableName,PATINDEX('%.%',@tableName)+1,26);
ELSE
SET @TeradataTableName = @TeradataDatabase + '.' + @TeradataTable;
DECLARE @insertStatement NVARCHAR(MAX) = '' --= 'SELECT '
, @columnStatement NVARCHAR(MAX) = 'INSERT INTO ' + @TeradataTableName + ' ('
, @schemaStatement NVARCHAR(MAX) = 'CREATE TABLE ' + @TeradataTableName + '('
, @currentID INT
, @firstID INT;
INSERT INTO @columnList
SELECT column_id
FROM sys.columns
WHERE object_id = OBJECT_ID(@tableName)
ORDER BY column_id;
SELECT @firstID = MIN(columnID) FROM @columnList;
WHILE EXISTS(SELECT * FROM @columnList)
BEGIN
SELECT @currentID = MIN(columnID) FROM @columnList;
IF @currentID <> @firstID
BEGIN
SELECT
@columnStatement = @columnStatement + ','
, @schemaStatement = @schemaStatement + ','
, @insertStatement = @insertStatement + '+'',''+';
END
SELECT @columnStatement = @columnStatement + '"' + SUBSTRING(name, 1, 30) + '"'
FROM sys.columns
WHERE object_id = OBJECT_ID(@tableName)
AND column_id = @currentID;
SELECT @schemaStatement = @schemaStatement + '"' + SUBSTRING(c.name, 1, 30) + '" '
+ CASE
WHEN t.name = 'BIT' THEN 'BYTEINT'
WHEN t.name = 'TINYINT' THEN 'SMALLINT'
WHEN t.name = 'UNIQUEIDENTIFIER' THEN 'CHAR(38)'
WHEN t.name = 'DATETIME' THEN 'TIMESTAMP(3)'
WHEN t.name = 'MONEY' THEN 'DECIMAL(18,4)'
WHEN t.name = 'XML' THEN 'CLOB'
WHEN t.name IN ('SMALLDATETIME', 'DATETIME2') THEN 'TIMESTAMP(0)'
WHEN t.name IN ('NVARCHAR','NCHAR')
THEN SUBSTRING(t.name, 2, 10) + '(' + CAST(c.max_length / 2 AS VARCHAR(4)) + ') CHARACTER SET UNICODE NOT CASESPECIFIC'
WHEN t.name IN ('VARCHAR','CHAR')
THEN t.name + '(' + CAST(c.max_length AS VARCHAR(4)) + ')'
ELSE t.name
END
+ CASE
WHEN c.is_nullable = 1 THEN ' NULL'
ELSE ' NOT NULL'
END
FROM sys.columns AS c
JOIN sys.types AS t
ON c.system_type_id = t.system_type_id
WHERE c.object_id = OBJECT_ID(@tableName)
AND c.column_id = @currentID;
SELECT DISTINCT @insertStatement = @insertStatement
+ 'CASE WHEN ' + QUOTENAME(c.name) + ' IS NULL THEN ''NULL'' ELSE ' +
+ CASE
WHEN t.name IN ('tinyint','smallint','int','real','float','bit','decimal','numeric','smallmoney','bigint') /* number-based columns */
THEN 'CAST(' + QUOTENAME(c.name) + ' AS VARCHAR(' + CAST(c.precision AS VARCHAR(10)) + '))'
WHEN t.name IN ('datetime', 'date', 'datetime2', 'smalldatetime') /* date-based columns */
THEN '''''''''+' + 'CONVERT(VARCHAR(23),' + QUOTENAME(c.name) + ',126)' + '+'''''''''
WHEN t.name IN ('uniqueidentifier') /* guid columns */
THEN '''''''''+' + 'CAST(' + QUOTENAME(c.name) + ' AS CHAR(36))' + '+'''''''''
WHEN t.name IN ('XML') /* xml columns */
THEN '''''''''+' + 'CAST(' + QUOTENAME(c.name) + ' AS VARCHAR(MAX))' + '+'''''''''
ELSE '''''''''+REPLACE(' + QUOTENAME(c.name) + ','''''''','''''''''''')+''''''''' --'''+''''''+''' /* character-based columns */
END
+ ' END '
FROM sys.columns AS c
JOIN sys.types AS t
ON c.system_type_id = t.system_type_id
WHERE c.object_id = OBJECT_ID(@tableName)
AND c.column_id = @currentID;
DELETE FROM @columnList WHERE columnID = @currentID;
END;
SET @insertStatement = 'SELECT ' + CASE WHEN @Top IS NOT NULL THEN 'TOP (' + @Top + ') ' ELSE '' END + '''' + @columnStatement + ') VALUES (''+' + @insertStatement + '+'');'' FROM ' + @tableName + ' WITH (NOLOCK);';
IF @GenerateSchema = 1
SELECT @schemaStatement + ');' AS 'Execute this statement in Teradata to create the table:'
IF @GenerateTruncate = 1
SELECT 'DELETE FROM ' + @TeradataTableName + ';' AS 'Execute this statement in Teradata to truncate the table:'
IF @Execute = 1
EXECUTE sp_executeSQL @insertStatement;
ELSE
SELECT @insertStatement AS 'Execute this statement in SQL Server to generate commands:';