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