Скопируйте схему таблицы из DB2 в SQL Server
Я смотрю на создание промежуточных таблиц в SQL Server для одного из наших пакетов служб SSIS, чтобы уменьшить количество обращений к DB2, поскольку при обращении к DB2 неактивные соединения могут возникать тайм-ауты. Существует ли автоматизированный метод копирования схемы таблиц из DB2 в SQL Server? Чтобы это работало, должно быть соответствие типов данных 1: 1 между DB2 и SQL Server. Если такого инструмента не существует, я могу написать его самостоятельно, так как некоторые из наших таблиц DB2 имеют более 20 столбцов, и было бы непросто вручную воссоздать в SQL Server.
1 ответ
У меня есть частично рабочий скрипт, который вы можете использовать. Нам не нужны первичные ключи и тому подобное от DB2 в сторону SQL Server. Наша единственная задача - получить данные. Кроме того, данные, с которыми мне приходилось иметь дело, были только на основе строки или даты, поэтому при построении типа data_type для десятичной дроби может быть неправильным.
Основная концепция заключается в том, что я проверяю sysibm.syscolumns
получить список всех таблиц и столбцов, а затем попытаться обеспечить перевод между типами данных DB2 и SQL Server.
В любом случае, дай ему шанс. Не стесняйтесь редактировать или комментировать то, что сломалось, и я посмотрю, смогу ли я это исправить.
Это построено с использованием сочетания функции SQL Server 2012 CONCAT и классического оператора конкатенации строк +
, Предполагается также, что для работы OPENQUERY существует связанный сервер.
WITH SRC AS
(
SELECT
OQ.NAME AS column_name
, OQ.TBNAME AS table_name
--, RTRIM(OQ.COLTYPE) AS data_type
, CASE RTRIM(OQ.COLTYPE)
WHEN 'INTEGER' THEN 'int'
WHEN 'SMALLINT' THEN 'smallint'
WHEN 'FLOAT' THEN 'float'
WHEN 'CHAR' THEN CONCAT('char', '(', OQ.LENGTH, ')')
WHEN 'VARCHAR' THEN CONCAT('varchar', '(', OQ.LENGTH, ')')
WHEN 'LONGVAR' THEN CONCAT('varchar', '(', OQ.LENGTH, ')')
WHEN 'DECIMAL' THEN CONCAT('decimal', '(', OQ.SCALE, ')')
WHEN 'DATE' THEN 'date'
WHEN 'TIME' THEN 'time'
WHEN 'TIMESTMP' THEN ''
WHEN 'TIMESTZ' THEN ''
WHEN 'BLOB' THEN ''
WHEN 'CLOB' THEN ''
WHEN 'DBCLOB' THEN ''
WHEN 'ROWID' THEN ''
WHEN 'DISTINCT' THEN ''
WHEN 'XML' THEN ''
WHEN 'BIGINT' THEN ''
WHEN 'BINARY' THEN ''
WHEN 'VARBIN' THEN ''
WHEN 'DECFLOAT' THEN ''
ELSE ''
END AS data_type
, OQ.LENGTH
, OQ.SCALE
, CONCAT(CASE OQ.NULLS WHEN 'Y' THEN 'NOT' ELSE '' END, ' NULL') AS allows_nulls
, OQ.UPDATES AS updateable
FROM
OPENQUERY(LINKED, 'SELECT * FROM abcde01.sysibm.syscolumns T WHERE T.TBCREATOR = ''ABCD'' ' ) AS OQ
)
, S2 AS
(
SELECT
CONCAT(QUOTENAME(S.column_name), ' ', S.data_type, ' ', S.allows_nulls) AS ColumnDeclaration
, S.table_name
FROM
SRC AS S
)
, MakeItPretty AS
(
SELECT DISTINCT
QUOTENAME(S.TABLE_NAME) AS TABLE_NAME
, STUFF
(
(
SELECT ',' + ColumnDeclaration
FROM S2 AS SI
WHERE
SI.TABLE_NAME = S.TABLE_NAME
FOR XML PATH('')),1,1,''
) AS column_list
FROM
S2 AS S
)
SELECT
CONCAT('CREATE TABLE ', MP.TABLE_NAME, char(13), MP.column_list) AS TableScript
FROM
MakeItPretty AS MP;