2013-08-27 57 views
0

我正在查看在SQL Server中为我们的SSIS包之一创建登台表,以减少对DB2的调用次数,因为当DB2回收非活动连接时,对DB2的调用可能会遇到超时。有没有一种自动方法将表模式从DB2复制到SQL Server?这需要在DB2和SQL Server之间进行1到1的数据类型映射才能实现。如果没有工具存在,我可以自己编写一个工具,因为我们的一些DB2表有20列,在SQL Server中手动重新创建会很麻烦。从DB2复制表模式到SQL Server

回答

2

我有一个部分工作的脚本,欢迎您使用。我们并不关心DB2中的主键等等,而是关于我们的SQL Server方面。我们唯一关心的是获取数据。另外,我不得不处理的数据仅仅是字符串或日期数据,因此在构建data_type的位置可能对小数不正确。

核心概念是我检查sysibm.syscolumns以派生所有表和列的列表,然后尝试提供DB2数据类型和SQL Server之间的转换。

反正,给它一个镜头。随时编辑或评论什么是坏的,我会看看我是否可以修复它。

这是使用SQL Server 2012 CONCAT函数和经典字符串连接运算符+的混合构建的。它还假定OPENQUERY有效,存在Linked服务器。

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的连接方面还没有运气。我正在使用IBM的OLE DB提供程序来创建链接服务器。我们的DB2 DBA在我的机器上安装了DB2 Connect,并为我们的每个环境定义了所有数据源名称,因此我不需要手动创建提供程序字符串。 –