2013-08-27 4 views
0

Je cherche à créer des tables de transfert dans SQL Server pour l'un de nos packages SSIS afin de réduire le nombre d'appels DB2 car les appels DB2 peuvent rencontrer des dépassements de délai lorsque DB2 recycle les connexions inactives. Existe-t-il une méthode automatisée pour copier le schéma de table de DB2 vers SQL Server? Il devrait y avoir un mappage 1 à 1 des types de données entre DB2 et SQL Server pour que cela fonctionne. S'il n'y a pas d'outil existant, je peux en écrire un moi-même, car certaines de nos tables DB2 ont plus de 20 colonnes et il serait difficile de recréer manuellement dans SQL Server.Copier le schéma de table de DB2 vers SQL Server

Répondre

2

J'ai un script partiellement fonctionnel que vous pouvez utiliser. Nous ne nous soucions pas des clés primaires et autres de DB2 dans notre côté SQL Server. Notre seule préoccupation est de récupérer les données. De plus, les données que j'ai eu à traiter étaient uniquement basées sur des chaînes ou des dates, donc l'endroit où je construis le type_données pourrait être incorrect pour la décimale.

Le concept de base est que j'inspecte le sysibm.syscolumns pour dériver une liste de toutes les tables et colonnes, puis essaie de fournir une traduction entre les types de données DB2 et SQL Server.

Quoi qu'il en soit, essayer. N'hésitez pas à modifier ou faire un commentaire sur ce qui est cassé et je verrai si je peux le réparer.

Ceci est construit en utilisant un mélange de la fonction CONCAT de SQL Server 2012 et de l'opérateur de concaténation de chaînes classique +. Il suppose également qu'un serveur lié existe pour que OPENQUERY fonctionne.

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

J'ai essayé de créer un serveur lié sur mon instance locale de SQL Server 2005 et SQL Server 2012, mais je n'ai pas eu de chance d'obtenir une connexion à DB2. J'utilise le fournisseur OLE DB d'IBM pour créer le serveur lié. Notre DB2 DBA a installé DB2 Connect sur ma machine et a défini tous les noms de sources de données pour chacun de nos environnements, donc je n'ai pas besoin de créer manuellement la chaîne Provider. –

Questions connexes