|
| 1 | +/********************************************************************************************************** |
| 2 | +
|
| 3 | + NAME: insert_statement_generator.sql |
| 4 | +
|
| 5 | + SYNOPSIS: Generates insert statements for Teradata using SQL Server metadata. |
| 6 | + This is useful for easily migrating small tables (i.e. < 1000 rows) |
| 7 | + from SQL Server to Teradata. DO NOT use on large tables. |
| 8 | +
|
| 9 | + DEPENDENCIES: The following dependencies are required to execute this script: |
| 10 | + - SQL Server 2005 or newer |
| 11 | +
|
| 12 | + AUTHOR: Michelle Ufford, http://sqlfool.com |
| 13 | + |
| 14 | + CREATED: 2012-07-26 |
| 15 | + |
| 16 | + VERSION: 1.0 |
| 17 | +
|
| 18 | + LICENSE: Apache License v2 |
| 19 | +
|
| 20 | + ---------------------------------------------------------------------------- |
| 21 | + DISCLAIMER: |
| 22 | + This code and information are provided "AS IS" without warranty of any kind, |
| 23 | + either expressed or implied, including but not limited to the implied |
| 24 | + warranties or merchantability and/or fitness for a particular purpose. |
| 25 | + ---------------------------------------------------------------------------- |
| 26 | +
|
| 27 | + --------------------------------------------------------------------------------------------------------- |
| 28 | + -- DATE VERSION AUTHOR DESCRIPTION -- |
| 29 | + --------------------------------------------------------------------------------------------------------- |
| 30 | + 20150619 1.0 Michelle Ufford Open Sourced on GitHub |
| 31 | +**********************************************************************************************************/ |
| 32 | + |
| 33 | +-- User-defined variables -- |
| 34 | +DECLARE |
| 35 | + @tableName NVARCHAR(128) = 'dbo.example_table' |
| 36 | + , @Top VARCHAR(10) = 1000 -- Leave NULL for all rows |
| 37 | + , @Execute BIT = 1 |
| 38 | + , @GenerateSchema BIT = 1 |
| 39 | + , @GenerateTruncate BIT = 1 |
| 40 | + , @TeradataDatabase VARCHAR(30) = 'mufford' |
| 41 | + , @TeradataTable VARCHAR(30) = NULL -- Will generate if you leave NULL |
| 42 | + |
| 43 | +-- Script-defined variables -- |
| 44 | + |
| 45 | +DECLARE @columnList TABLE (columnID INT); |
| 46 | +DECLARE @TeradataTableName VARCHAR(60); |
| 47 | + |
| 48 | +IF @TeradataTable IS NULL |
| 49 | + SET @TeradataTableName = @TeradataDatabase + '.tmp_' + SUBSTRING(@tableName,PATINDEX('%.%',@tableName)+1,26); |
| 50 | +ELSE |
| 51 | + SET @TeradataTableName = @TeradataDatabase + '.' + @TeradataTable; |
| 52 | + |
| 53 | +DECLARE @insertStatement NVARCHAR(MAX) = '' --= 'SELECT ' |
| 54 | + , @columnStatement NVARCHAR(MAX) = 'INSERT INTO ' + @TeradataTableName + ' (' |
| 55 | + , @schemaStatement NVARCHAR(MAX) = 'CREATE TABLE ' + @TeradataTableName + '(' |
| 56 | + , @currentID INT |
| 57 | + , @firstID INT; |
| 58 | + |
| 59 | +INSERT INTO @columnList |
| 60 | +SELECT column_id |
| 61 | +FROM sys.columns |
| 62 | +WHERE object_id = OBJECT_ID(@tableName) |
| 63 | +ORDER BY column_id; |
| 64 | + |
| 65 | +SELECT @firstID = MIN(columnID) FROM @columnList; |
| 66 | + |
| 67 | +WHILE EXISTS(SELECT * FROM @columnList) |
| 68 | +BEGIN |
| 69 | + |
| 70 | + SELECT @currentID = MIN(columnID) FROM @columnList; |
| 71 | + |
| 72 | + IF @currentID <> @firstID |
| 73 | + BEGIN |
| 74 | + SELECT |
| 75 | + @columnStatement = @columnStatement + ',' |
| 76 | + , @schemaStatement = @schemaStatement + ',' |
| 77 | + , @insertStatement = @insertStatement + '+'',''+'; |
| 78 | + END |
| 79 | + |
| 80 | + SELECT @columnStatement = @columnStatement + '"' + SUBSTRING(name, 1, 30) + '"' |
| 81 | + FROM sys.columns |
| 82 | + WHERE object_id = OBJECT_ID(@tableName) |
| 83 | + AND column_id = @currentID; |
| 84 | + |
| 85 | + SELECT @schemaStatement = @schemaStatement + '"' + SUBSTRING(c.name, 1, 30) + '" ' |
| 86 | + + CASE |
| 87 | + WHEN t.name = 'BIT' THEN 'BYTEINT' |
| 88 | + WHEN t.name = 'TINYINT' THEN 'SMALLINT' |
| 89 | + WHEN t.name = 'UNIQUEIDENTIFIER' THEN 'CHAR(38)' |
| 90 | + WHEN t.name = 'DATETIME' THEN 'TIMESTAMP(3)' |
| 91 | + WHEN t.name = 'MONEY' THEN 'DECIMAL(18,4)' |
| 92 | + WHEN t.name = 'XML' THEN 'CLOB' |
| 93 | + WHEN t.name IN ('SMALLDATETIME', 'DATETIME2') THEN 'TIMESTAMP(0)' |
| 94 | + WHEN t.name IN ('NVARCHAR','NCHAR') |
| 95 | + THEN SUBSTRING(t.name, 2, 10) + '(' + CAST(c.max_length / 2 AS VARCHAR(4)) + ') CHARACTER SET UNICODE NOT CASESPECIFIC' |
| 96 | + WHEN t.name IN ('VARCHAR','CHAR') |
| 97 | + THEN t.name + '(' + CAST(c.max_length AS VARCHAR(4)) + ')' |
| 98 | + ELSE t.name |
| 99 | + END |
| 100 | + + CASE |
| 101 | + WHEN c.is_nullable = 1 THEN ' NULL' |
| 102 | + ELSE ' NOT NULL' |
| 103 | + END |
| 104 | + FROM sys.columns AS c |
| 105 | + JOIN sys.types AS t |
| 106 | + ON c.system_type_id = t.system_type_id |
| 107 | + WHERE c.object_id = OBJECT_ID(@tableName) |
| 108 | + AND c.column_id = @currentID; |
| 109 | + |
| 110 | + SELECT DISTINCT @insertStatement = @insertStatement |
| 111 | + + 'CASE WHEN ' + QUOTENAME(c.name) + ' IS NULL THEN ''NULL'' ELSE ' + |
| 112 | + + CASE |
| 113 | + WHEN t.name IN ('tinyint','smallint','int','real','float','bit','decimal','numeric','smallmoney','bigint') /* number-based columns */ |
| 114 | + THEN 'CAST(' + QUOTENAME(c.name) + ' AS VARCHAR(' + CAST(c.precision AS VARCHAR(10)) + '))' |
| 115 | + WHEN t.name IN ('datetime', 'date', 'datetime2', 'smalldatetime') /* date-based columns */ |
| 116 | + THEN '''''''''+' + 'CONVERT(VARCHAR(23),' + QUOTENAME(c.name) + ',126)' + '+''''''''' |
| 117 | + WHEN t.name IN ('uniqueidentifier') /* guid columns */ |
| 118 | + THEN '''''''''+' + 'CAST(' + QUOTENAME(c.name) + ' AS CHAR(36))' + '+''''''''' |
| 119 | + WHEN t.name IN ('XML') /* xml columns */ |
| 120 | + THEN '''''''''+' + 'CAST(' + QUOTENAME(c.name) + ' AS VARCHAR(MAX))' + '+''''''''' |
| 121 | + ELSE '''''''''+REPLACE(' + QUOTENAME(c.name) + ','''''''','''''''''''')+''''''''' --'''+''''''+''' /* character-based columns */ |
| 122 | + END |
| 123 | + + ' END ' |
| 124 | + FROM sys.columns AS c |
| 125 | + JOIN sys.types AS t |
| 126 | + ON c.system_type_id = t.system_type_id |
| 127 | + WHERE c.object_id = OBJECT_ID(@tableName) |
| 128 | + AND c.column_id = @currentID; |
| 129 | + |
| 130 | + DELETE FROM @columnList WHERE columnID = @currentID; |
| 131 | + |
| 132 | +END; |
| 133 | + |
| 134 | +SET @insertStatement = 'SELECT ' + CASE WHEN @Top IS NOT NULL THEN 'TOP (' + @Top + ') ' ELSE '' END + '''' + @columnStatement + ') VALUES (''+' + @insertStatement + '+'');'' FROM ' + @tableName + ' WITH (NOLOCK);'; |
| 135 | + |
| 136 | +IF @GenerateSchema = 1 |
| 137 | + SELECT @schemaStatement + ');' AS 'Execute this statement in Teradata to create the table:' |
| 138 | + |
| 139 | +IF @GenerateTruncate = 1 |
| 140 | + SELECT 'DELETE FROM ' + @TeradataTableName + ';' AS 'Execute this statement in Teradata to truncate the table:' |
| 141 | + |
| 142 | +IF @Execute = 1 |
| 143 | + EXECUTE sp_executeSQL @insertStatement; |
| 144 | +ELSE |
| 145 | + SELECT @insertStatement AS 'Execute this statement in SQL Server to generate commands:'; |
0 commit comments