2013-08-27 2 views
0

Я ищу создание промежуточных таблиц в SQL Server для одного из наших пакетов SSIS, чтобы сократить количество вызовов в DB2, поскольку вызовы DB2 могут возникать таймауты, когда DB2 перерабатывает неактивные соединения. Существует ли автоматизированный метод копирования схемы таблиц с DB2 на SQL Server? Для этого необходимо будет отображать от 1 до 1 типы данных между DB2 и SQL Server. Если нет инструмента, который существует, я могу написать его сам, поскольку некоторые из наших таблиц DB2 имеют 20 + столбцов, и было бы больно вручную воссоздать в SQL Server.Скопируйте схему таблицы из DB2 в SQL Server

ответ

2

У меня есть частично рабочий скрипт, который вы можете использовать. Мы не заботимся о первичных ключах и таких, как DB2, в нашу сторону SQL Server. Наша единственная проблема заключается в том, чтобы получить данные. Кроме того, данные, с которыми мне приходилось иметь дело, были связаны только с строкой или датой, поэтому, когда я создаю файл data_type, может быть некорректным для десятичного числа.

Основная идея заключается в том, что я проверяю sysibm.syscolumns на получение списка всех таблиц и столбцов, а затем попытаюсь обеспечить перевод между типами данных DB2 и SQL Server.

В любом случае, сделайте снимок. Не стесняйтесь редактировать или делать комментарии о том, что сломано, и я посмотрю, смогу ли я это исправить.

Это построено с использованием функции CONCAT SQL Server 2012 и классического оператора конкатенации строк +. Он также предполагает наличие связанного сервера для работы 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; 
+0

Я попытался создать связанный сервер в своем локальном экземпляре SQL Server 2005 и SQL Server 2012, но не успел установить соединение с DB2. Я использую поставщик OLE DB от IBM для создания связанного сервера. Наш DB2 DBA настроил DB2 Connect на моей машине и определил все имена источников данных для каждой из наших сред, поэтому мне не нужно вручную создавать строку Provider. –

Смежные вопросы