專案設定 (轉換) (DB2ToSQL)
[專案設定] 對話方塊的 [轉換] 頁面包含自訂 SSMA 如何將 DB2 語法轉換成 SQL Server 語法的設定。
[轉換] 窗格位於 [專案設定] 和 [預設專案設定] 對話方塊中:
若要指定所有 SSMA 專案的設定,請在 [工具] 功能表上按一下 [預設專案設定],從 [移轉目標版本] 下拉式清單中選取需要檢視或變更其設定的移轉專案類型,接著按一下左窗格底部的 [一般],然後按一下 [轉換]。
若要指定目前專案的設定,請在 [工具] 功能表上按一下 [專案設定],接著按一下左窗格底部的 [一般],然後按一下 [轉換]。
轉換訊息
產生適用的問題相關訊息
指定 SSMA 是否會在轉換期間產生參考性訊息、在 [輸出] 窗格中顯示訊息,並新增至已轉換的程式碼。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式模式:否
完整模式:否
其他選項
將 ROWNUM 運算式轉換成整數
SSMA 轉換 ROWNUM 運算式時,會將運算式轉換成 TOP 子句,後面接著運算式。 下列範例顯示 DB2 DELETE 子句中的 ROWNUM:
DELETE FROM Table1
WHERE ROWNUM < expression and Field1 >= 2
下列範例顯示產生的 Transact-SQL:
DELETE TOP (expression-1)
FROM Table1
WHERE Field1>=2
TOP 要求 TOP 子句運算式評估為整數。 如果整數為負數,陳述式會產生錯誤。
如果您選取 [是],SSMA 會將運算式轉換成整數。
如果您選取 [否],SSMA 會將所有非整數運算式標示為已轉換程式碼中的錯誤。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/完整模式:否
開放式模式:是
預設結構描述對應
此設定會指定 DB2 結構描述如何對應至 SQL Server 結構描述。 此設定提供兩個選項:
結構描述對資料庫:在此模式中,DB2 結構描述「sch1」預設會對應至 SQL Server 資料庫「sch1」中的「dbo」SQL Server 結構描述。
結構描述對結構描述:在此模式中,DB2 結構描述「sch1」預設會對應至連線對話方塊中提供的預設 SQL Server 資料庫之「sch1」SQL Server 結構描述。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:結構描述對資料庫
MERGE 陳述式的轉換方式
如果您選取 [使用 INSERT、UPDATE、DELETE 陳述式],SSMA 會將 MERGER 陳述式轉換成 INSERT、UPDATE、DELETE 陳述式。
如果您選取 [使用 MERGE 陳述式],SSMA 會將 MERGE 陳述式轉換成 SQL Server 中的 MERGE 陳述式。
警告
此專案設定選項僅適用於 SQL Server 2008,SQL Server 2012,SQL Server 2014。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:使用 MERGE 陳述式
將呼叫轉換為使用預設引數的副程式
SQL Server 函式不支援在函式呼叫中省略參數。 此外,SQL Server 函式和程序不支援運算式做為預設參數值。
如果您選取 [是] 且函式呼叫省略了參數,SSMA 會將關鍵字 default 插入函式中,並在正確的位置呼叫。 然後會以警告標示呼叫。
如果您選取 [否],SSMA 會將函式呼叫標示為錯誤。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:是
將 COUNT 函式轉換為 COUNT_BIG
如果您的 COUNT 函式可能傳回大於 2,2,147,483,647 的值,也就是 231-1,您應該將函式轉換成 COUNT_BIG。
如果您選取 [是],SSMA 會將所有使用的 COUNT 都轉換為 COUNT_BIG。
如果您選取 [否],函式會維持為 COUNT。 如果函式傳回大於231-1 的值,SQL Server 會傳回錯誤。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/完整模式:是
開放式模式:否
將 FORALL 陳述式轉換為 WHILE 陳述式
定義 SSMA 如何處理 PL/SQL 集合元素上的 FORALL 迴圈。
如果您選取 [是],SSMA 會建立 WHILE 迴圈,系統會逐一擷取其中的集合元素。
如果您選取 [否],SSMA 會使用 nodes( ) 方法從集合產生資料列集,並將它當做單一資料表使用。 這更有效率,但讓輸出程式碼更不容易閱讀。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式模式:否
完整模式:是
在 NOT Null 的資料行上,使用 SET Null 參考動作轉換外部索引鍵
DB2 允許建立外部索引鍵條件約束,因為參考的資料行中不允許 Null 動作,因此無法執行 SET Null 動作。 SQL Server 不允許這類外部索引鍵設定。
如果您選取 [是],SSMA 將會產生 DB2 中的參考動作,但您必須在載入條件約束以 SQL Server 之前進行手動變更。 例如,您可以選擇 [NO ACTION],而不是 [SET Null]。
如果您選取 [否],條件約束將會標示為錯誤。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:否
將函式呼叫轉換為程序呼叫
某些 DB2 函式會定義為自發交易,或是包含在 SQL Server 中無效的陳述式。 在這些情況下,SSMA 會建立一個程序和一個函式 (該程序的包裝函式)。 轉換的函式會呼叫實作程序。
SSMA 可以將包裝函式呼叫轉換為程序呼叫。 這會建立更容易閱讀的程式碼,且可改善效能。 不過,情境不一定允許這麼做;例如,您無法將 SELECT 清單中的函式呼叫取代為程序呼叫。 SSMA 有幾個選項可涵蓋常見案例:
如果您選取 [永遠],SSMA 會嘗試將包裝函式函式呼叫轉換成程序呼叫。 如果目前的情境不允許此轉換,就會產生錯誤訊息。 如此一來,產生的程式碼中就不會留下任何函式呼叫。
如果您選取 [可能的話],SSMA 只有在函式具有輸出參數時,才會移至程序呼叫。 無法移動時,便會移除參數的輸出屬性。 在其他所有情況下,SSMA 都會離開函式呼叫。
如果您選取 [永不],SSMA 會將所有函式呼叫保留為原樣。 有時候因為效能原因,這個選項可能無法接受。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:可能的話
轉換 LOCK TABLE 陳述式
SSMA 可以將許多 LOCK TABLE 陳述式轉換成資料表提示。 SSMA 無法轉換任何包含 PARTITION、SUBPARTITION、@dblink 和 NOWAIT 子句的 LOCK TABLE 陳述式,而且會將這類陳述式標示為轉換錯誤訊息。
如果您選取 [是],SSMA 會將支援的 LOCK TABLE 陳述式轉換成資料表提示。
如果您選取 [否],SSMA 會標示所有 LOCK TABLE 陳述式並顯示轉換錯誤訊息。
下表顯示 SSMA 如何轉換 DB2 鎖定模式:
DB2 鎖定模式 | SQL Server 資料表提示 |
---|---|
ROW SHARE | ROWLOCK、HOLDLOCK |
ROW EXCLUSIVE | ROWLOCK、XLOCK、HOLDLOCK |
SHARE UPDATE = ROW SHARE | ROWLOCK、HOLDLOCK |
SHARE | TABLOCK、HOLDLOCK |
SHARE ROW EXCLUSIVE | TABLOCK、XLOCK、HOLDLOCK |
EXCLUSIVE | TABLOCKX、HOLDLOCK |
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:是
針對 REF CURSOR OUT 參數轉換 OPEN-FOR 陳述式
在 DB2 中,OPEN-FOR 陳述式可用來將結果集傳回至 REF CURSOR 類型的副程式 OUT 參數。 在 SQL Server 中,預存程序會直接傳回 SELECT 陳述式的結果。
SSMA 可以將許多 OPEN-FOR 陳述式轉換成 SELECT 陳述式。
如果您選取 [是],SSMA 會將 OPEN-FOR 陳述式轉換成 SELECT 陳述式,以將結果集傳回給用戶端。
如果您選取 [否],SSMA 會在已轉換的程式碼和 [輸出] 窗格中產生錯誤訊息。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:是
將記錄轉換成個別變數的清單
SSMA 可以將 DB2 記錄轉換成不同的變數,以及轉換成具有特定結構的 XML 變數。
如果您選取 [是],SSMA 會盡可能將記錄轉換成個別變數的清單。
如果您選取 [否],SSMA 會將記錄轉換成具有特定結構的 XML 變數。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:是
將 SUBSTR 函式呼叫轉換為 SUBSTRING 函式呼叫
SSMA 可以根據參數數目,將 DB2 SUBSTR 函式呼叫轉換成 SQL Server substring 函式呼叫。 如果 SSMA 無法轉換 SUBSTR 函式呼叫,或不支援參數數目,SSMA 會將 SUBSTR 函式呼叫轉換成自訂 SSMA 函式呼叫。
如果您選取 [是],SSMA 會將使用三個參數的 SUBSTR 函式呼叫轉換成SQL Server substring。 其他 SUBSTR 函式會轉換成自訂 SSMA 函式呼叫。
如果您選取 [否],SSMA 會將 SUBSTR 函式呼叫轉換成自訂 SSMA 函式呼叫。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式模式:是
完整模式:否
轉換子類型
SSMA 可透過兩種方式轉換 PL/SQL 子類型:
如果您選取 [是],SSMA 會從子類型建立 SQL Server 使用者定義類型,並用於這個子類型的每個變數。
如果您選取 [否],SSMA 會將子類型的所有來源宣告取代為基礎類型,並如往常轉換結果。 在此情況下,不會在 SQL Server 中建立其他類型
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:否
轉換同義字
下列 DB2 物件的同義字可以移轉至 SQL Server:
資料表和物件資料表
檢視和物件檢視
預存程序和函式
具體化檢視
下列 DB2 物件的同義字可以用物件的直接參考取代:
序列
套件
Java 類別結構描述物件
使用者定義的物件類型
其他同義字無法移轉。 SSMA 會產生同義字的錯誤訊息,以及使用同義字的所有參考。
如果您選取 [是],SSMA 會根據前一個清單建立 SQL Server 同義字和直接物件參考。
如果您選取 [否],SSMA 會針對此處所列的所有同義字建立直接物件參考。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:是
轉換 TO_CHAR(date, format)
SSMA 可以將 DB2 TO_CHAR(date, format) 轉換成 sysdb 資料庫中的程序。
如果您選取 [使用 TO_CHAR_DATE 函式],SSMA 會使用英文語言將 TO_CHAR(date, format) 轉換成 TO_CHAR_DATE 函式以進行轉換。
如果您選取 [使用 TO_CHAR_DATE_LS 函式 (NLS 處理)],SSMA 會使用工作階段語言將 TO_CHAR(date, format) 轉換成 TO_CHAR_DATE_LS 函式以進行轉換
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式模式:使用 TO_CHAR_DATE 函式
完整模式: 使用 TO_CHAR_DATE_LS 函式 (NLS 處理)
轉換交易處理陳述式
SSMA 可以轉換 DB2 交易處理陳述式:
如果您選取 [是],SSMA 會將 DB2 交易處理陳述式轉換成 SQL Server 陳述式。
如果您選取 [否],SSMA 會將交易處理陳述式標示為轉換錯誤。
注意
DB2 會隱含開啟交易。 若要在 SQL Server 上模擬此行為,您必須在希望開始交易的位置手動新增 BEGIN TRANSACTION 陳述式。 或者,您可以在工作階段開頭執行 SET IMPLICIT_TRANSACTIONS ON 命令。 SSMA 會在使用自發交易轉換副程式時自動新增 SET IMPLICIT_TRANSACTIONS ON。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:是
在 ORDER BY 子句中模擬 DB2 Null 行為
NULL 值在 SQL Server 和 DB2 中會以不同的方式排序:
在 SQL Server 中,NULL 值是排序清單中的最小值。 在遞增清單中,NULL 值會先出現。
在 DB2 中,NULL 值是排序清單中的最大值。 根據預設,NULL 值最後會出現在遞增順序清單中。
DB2 具有 NULLS FIRST 和 NULLS LAST 子句,可讓您變更 DB2 排序 NULL 的方式。
SSMA 可以藉由檢查 NULL 值來模擬 DB2 ORDER BY 行為。 然後它會依指定的順序依 NULL 值排序,然後依其他值排序。
如果您選取 [是],SSMA 會以模擬 DB2 ORDER BY 行為的方式轉換 DB2 陳述式。
如果您選取 [否],SSMA 將會忽略 DB2 規則,並在遇到 NULLS FIRST 和 NULLS LAST 子句時產生錯誤訊息。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式模式:否
完整模式::是
在 SELECT 中模擬資料列計數例外狀況
如果具有 INTO 子句的 SELECT 陳述式未傳回任何資料列,DB2 會引發NO_DATA_FOUND 例外狀況。 如果陳述式傳回兩個或多個資料列,則會引發 TOO_MANY_ROWS 例外狀況。 如果資料列計數非一,SQL Server 中的轉換陳述式不會引發任何例外狀況。
如果您選取 [是],SSMA 會在每個 SELECT 陳述式之後,將呼叫新增至 sysdb 程序 db_error_exact_one_row_check。 此程序會模擬 NO_DATA_FOUND 和 TOO_MANY_ROWS 例外狀況。 這是預設值,可盡可能接近重現 DB2 行為。 如果原始程式碼具有負責處理這類錯誤的例外處理常式,您應該一律選擇 [是]。 請注意,如果 SELECT 陳述式發生在使用者定義函式內,此模組會轉換成預存程序,因為執行預存程序並引發例外狀況與 SQL Server 函式內容不相容。
如果您選取 [否],系統將不會產生例外狀況。 當 SSMA 轉換使用者定義函式,而且您想要維持 SQL Server 中的函式時,這可能會相當實用
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:是
產生 DBMS_SQL.PARSE 的錯誤
如果您選取 [錯誤],SSMA 會在轉換 DBMS_SQL.PARSE 產生錯誤。
如果您選取 [警告],SSMA 會在轉換 DBMS_SQL.PARSE 產生警告。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:錯誤
產生 ROWID 資料行
SSMA 在 SQL Server 中建立資料表時,可以建立 ROWID 資料行。 移轉資料時,每個資料列都會取得 newid() 函式所產生的新 UNIQUEIDENTIFIER 值。
如果您選取 [是],則會在所有資料表上建立 ROWID 資料行,且 SQL Server 在您插入值時產生 GUID。 如果您打算使用 SSMA 測試工具,請一律選擇 [是]。
如果您選取 [否],就不會將 ROWID 資料行新增至資料表。
為具有觸發程序的資料表新增 ROWID 資料行,為包含觸發程序的資料表新增 ROWID。
警告
SQL Server 2005、SQL Server 2008 和 SQL Server 2012 和 2014 的預設設定是為具有觸發程序的資料表新增 ROWID 資料行。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式模式:為具有觸發程序的資料表新增 ROWID 資料行
完整模式::是
在 ROWID 資料行上產生唯一索引
指定 SSMA 是否在 ROWID 產生的資料行上產生唯一的索引資料行。 如果選項設定為 [是],就會產生唯一索引,而如果設為「否」,則不會在 ROWID 資料行上產生唯一索引。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:是
本機模組轉換
定義 DB2 巢狀副程式 (獨立預存程序或函式中所宣告) 轉換的類型。
如果您選取 [內嵌],巢狀副程式呼叫將會由其主體取代。
如果您選取 [預存程序],巢狀副程式將會轉換成 SQL Server 預存程序,而且會在此程序呼叫上取代其呼叫。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:內嵌
在字串串連中使用 ISNULL
字串串連包含 NULL 值時,DB2 和SQL Server 會傳回不同的結果。 DB2 會將 NULL 值視為空字元集。 SQL Server 傳回 NULL。
如果您選取 [是],SSMA 會以 SQL Server 串連字元 (+) 取代 DB2 串連字元 (||)。 SSMA 也會檢查串連兩端的運算式是否有 NULL 值。
如果您選取 [否],SSMA 會取代串連字元,但不會檢查 NULL 值。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
在 REPLACE 函式呼叫中使用 ISNULL
ISNULL 陳述式用於 REPLACE 函式呼叫中,以模擬 DB2 行為。 此設定提供下列選項:
YES
否
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式模式:否
完整模式:是
在 CONCAT 函式呼叫中使用 ISNULL
ISNULL 陳述式用於 CONCAT 函式呼叫中,以模擬 DB2 行為。 此設定提供下列選項:
YES
否
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式模式:否
完整模式::是
盡可能使用原生轉換函式
如果您選取 [是],SSMA 會盡可能將TO_CHAR(date, format) 轉換成原生轉換函式。
如果您選取 [否],SSMA 會將TO_CHAR(date, format) 轉換成TO_CHAR_DATE 或 TO_CHAR_DATE_LS (由「Convert TO_CHAR(date, format)」的選項定義)。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式模式:是
完整模式:否
針對記錄變數轉換 SELECT...INTO 時使用 SELECT...FOR XML
指定選取記錄變數時,是否要產生 XML 結果集。
如果您選取 [是],SELECT 陳述式會傳回 XML。
如果您選取 [否],SELECT 陳述式會傳回結果集。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:否
RETURNING 子句轉換
將 DELETE 陳述式中的 RETURNING 子句轉換為 OUTPUT
DB2 提供 RETURNING 子句作為立即取得已刪除值的方法。 SQL Server 是透過 OUTPUT 子句提供此功能。
如果您選取 [是],SSMA 會將 DELETE 陳述式中的 RETURNING 子句轉換為 OUTPUT 子句。 因為資料表上的觸發程序可以變更值,所以 SQL Server 傳回的值可能與 DB2 不同。
如果您選取 [否],SSMA 會在 DELETE 陳述式之前產生 SELECT 陳述式,以擷取傳回的值。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:是
將 INSERT 陳述式中的 RETURNING 子句轉換為 OUTPUT
DB2 提供 RETURNING 子句作為立即取得插入值的方法。 SQL Server 是透過 OUTPUT 子句提供此功能。
如果您選取 [是],SSMA 會將 INSERT 陳述式中的 RETURNING 子句轉換成 OUTPUT。 因為資料表上的觸發程序可以變更值,所以 SQL Server 傳回的值可能與 DB2 不同。
如果您選取 [否],SSMA 會插入並選取參考資料表中的值,以模擬 DB2 功能。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:是
將 UPDATE 陳述式中的 RETURNING 子句轉換為 OUTPUT
DB2 提供 RETURNING 子句作為立即取得更新值的方法。 SQL Server 是透過 OUTPUT 子句提供此功能。
如果您選取 [是],SSMA 會將 UPDATE 陳述式中的 RETURNING 子句轉換為 OUTPUT 子句。 因為資料表上的觸發程序可以變更值,所以 SQL Server 傳回的值可能與 DB2 不同。
如果您選取 [否],SSMA 會在 UPDATE 陳述式之後產生 SELECT 陳述式,以擷取傳回的值。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:是
序列轉換
轉換序列產生器
在 DB2 中,您可以使用序列來產生唯一識別碼。
SSMA 可以將序列轉換成下列項目。
使用 SQL Server 序列產生器 (只有在轉換成 SQL Server 2012 和 SQL Server 2014 時,才能使用此選項)。
使用 SSMA 序列產生器。
使用資料行識別。
轉換成 SQL Server 2012 或 SQL Server 2014 時的預設選項,是使用 SQL Server 序列產生器。 不過,SQL Server 2012 和 SQL Server 2014 不支援取得目前的序列值 (例如 DB2 序列 currval 方法) 。 如需移轉 DB2 序列 currval 方法的指引,請參閱 SSMA 團隊部落格網站。
SSMA 也提供將 DB2 序列轉換成 SSMA 序列模擬器的選項。 當您轉換成 SQL Server 2012 之前的版本時,這是預設選項
最後,您也可以將指派給資料表中資料行的序列轉換成 SQL Server 識別值。 您必須在 DB2 [資料表] 索引標籤上指定序列與識別欄位之間的對應
轉換 CURRVAL 外部觸發程序
只有在轉換序列產生器設定為使用資料行識別時,才會顯示此項。 因為 DB2 序列是獨立於資料表的物件,所以許多使用序列的資料表都會使用觸發程序,以產生並插入新的序列值。 SSMA 會將這些陳述式設為註解,或在設為註解會產生錯誤時將它們標示為錯誤。
如果您選取 [是],SSMA 會標示已轉換序列 CURRVAL 上所有外部觸發程序的參考,並顯示警告。
如果您選取 [否],SSMA 會標示已轉換序列 CURRVAL 上所有外部觸發程序的參考,並顯示錯誤。