【问题标题】:Copy table schema from DB2 to SQL Server将表模式从 DB2 复制到 SQL Server
【发布时间】:2013-08-30 06:18:42
【问题描述】:

我正在考虑在 SQL Server 中为我们的一个 SSIS 包创建临时表,以减少对 DB2 的调用次数,因为当 DB2 回收非活动连接时,对 DB2 的调用可能会超时。是否有将表模式从 DB2 复制到 SQL Server 的自动化方法?需要在 DB2 和 SQL Server 之间建立一对一的数据类型映射才能工作。如果不存在工具,我可能会自己编写一个,因为我们的一些 DB2 表有 20 多列,在 SQL Server 中手动重新创建会很痛苦。

【问题讨论】:

    标签: sql-server ssis db2 schema staging-table


    【解决方案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;
    

    【讨论】:

    • 我尝试在我的本地 SQL Server 2005 和 SQL Server 2012 实例上创建链接服务器,但没有成功连接到 DB2。我正在使用 IBM 的 OLE DB 提供程序来创建链接服务器。我们的 DB2 DBA 已在我的机器上设置了 DB2 Connect,并为我们的每个环境定义了所有数据源名称,因此我不需要手动创建提供程序字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多