2013-08-27 55 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,併爲我們的每個環境定義了所有數據源名稱,因此我不需要手動創建提供程序字符串。 –