Скопируйте схему таблицы из 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;
Другие вопросы по тегам