0

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

4

1 回答 1

2

我有一个部分工作的脚本,欢迎您使用。我们不关心从 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;
于 2013-08-27T13:31:58.243 回答