專案設定(轉換) (Db2ToSQL)
[項目設定] 對話方塊的 [轉換] 頁面包含可自訂 SQL Server 移轉小幫手 (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
預設會對應至dbo
SQL Server 資料庫中sch1
的 SQL Server 架構。架構對架構: 在此模式中,Db2 架構
sch1
預設會對應至sch1
連接對話框中提供的預設 SQL Server 資料庫中的 SQL Server 架構。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:結構描述對資料庫
MERGE 陳述式的轉換方式
如果您選取 [使用 INSERT、UPDATE、DELETE 陳述式],SSMA 會將 MERGER 陳述式轉換成 INSERT、UPDATE、DELETE 陳述式。
如果您選取 [使用 MERGE 陳述式],SSMA 會將 MERGE 陳述式轉換成 SQL Server 中的 MERGE 陳述式。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:使用 MERGE 陳述式
將呼叫轉換為使用預設引數的副程式
SQL Server 函式不支援在函數調用中省略參數。 此外,SQL Server 函式和程式不支援表示式做為預設參數值。
如果您選取 [ 是 ],且函式呼叫省略參數,SSMA 會將關鍵詞 預設值 插入函式中,並以正確的位置呼叫。 然後,它會以警告標示呼叫。
如果您選取 [ 否],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 允許建立外鍵條件約束,因為參考數據行中不允許 NUL,因此無法執行 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 子字串 函數調用。 如果 SSMA 無法轉換 SUBSTR 函數調用,或不支持參數數目,SSMA 會將 SUBSTR 函數調用轉換成自定義 SSMA 函數調用。
如果您選取 [ 是],SSMA 會將使用三個參數的 SUBSTR 函式呼叫轉換成 SQL Server 子字串。 其他 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 行為
SQL Server 和 Db2 中的 NULL 值會以不同的方式排序:
在 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產生錯誤。解析。
如果您選取 [ 警告],SSMA 會在轉換DBMS_SQL產生警告。解析。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:錯誤
產生 ROWID 資料行
SSMA 在 SQL Server 中建立資料表時,可以建立 ROWID 資料行。 移轉資料時,每個資料列都會取得 newid() 函式所產生的新 UNIQUEIDENTIFIER 值。
如果您選取 [ 是],則會在所有數據表上建立 ROWID 數據行,而當您插入值時,SQL Server 會產生 GUID。 如果您打算使用 SSMA Tester,請一律選擇 [是 ]。
如果您選取 [ 否],ROWID 數據行就不會新增至數據表。
針對具有觸發程式的數據表新增 ROWID 數據行,為包含觸發 程式的數據表新增 ROWID (預設值)。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式模式:為具有觸發程序的資料表新增 ROWID 資料行
完整模式::是
在 ROWID 資料行上產生唯一索引
指定 SSMA 是否在 ROWID 產生的資料行上產生唯一的索引資料行。 如果選項設定為 YES
,則會產生唯一索引。 如果設定為 NO
,則ROWID資料行上不會產生唯一索引。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:是
本機模組轉換
定義 Db2 巢狀子程式的類型(在獨立預存程式或函式中宣告) 轉換。
如果您選取 [內嵌],巢狀子程式呼叫會由其主體取代。
如果您選取 [ 預存程式],巢狀子程式會轉換成 SQL Server 預存程式,而且會在此過程調用上取代其呼叫。
當您在 [模式] 方塊中選取轉換模式時,SSMA 會套用下列設定:
預設/開放式/完整模式:內嵌
在字串串連中使用 ISNULL
當字串串連包含 NULL
值時,Db2 和 SQL Server 會傳回不同的結果。 Db2 會將 NULL
值視為空字元集。 SQL Server 會傳回 NULL
。
如果您選取 [ 是],SSMA 會將 Db2 串連字元 (||) 取代為 SQL Server 串連字元 (+)。 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(日期、格式)轉換成TO_CHAR_DATE或TO_CHAR_DATE_LS(由 [轉換TO_CHAR(日期、格式)] 選項所定義)。
當您在 [模式] 方塊中選取轉換模式時,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 序列產生器。
使用 SSMA 序列產生器。
使用資料行識別。
轉換成 SQL Server 時的預設選項是使用時序產生器。 不過,SQL Server 2012 (11.x) 和 SQL Server 2014 (12.x) 不支援取得目前的序列值(例如 Db2 序列 currval 方法)。 如需移轉 Db2 時序 currval 方法的指引,請參閱 SSMA 小組部落格網站。
SSMA 也提供選項,可將 Db2 序列轉換成 SSMA 序列模擬器。
最後,您也可以將指派給資料表中資料行的序列轉換成 SQL Server 識別值。 您必須在 [Db2 資料表 ] 索引標籤上指定序列與標識列之間的對應
轉換 CURRVAL 外部觸發程序
只有在轉換序列產生器設定為使用資料行識別時,才會顯示此項。 因為 Db2 序列是與資料表不同的物件,因此許多使用時序的數據表都會使用觸發程式來產生並插入新的序列值。 SSMA 會將這些陳述式設為註解,或在設為註解會產生錯誤時將它們標示為錯誤。
如果您選取 [ 是],SSMA 會以警告標記已轉換序列 CURRVAL 上對外部觸發程式的所有參考。
如果您選取 [ 否],SSMA 會在轉換的序列 CURRVAL 上標記對外部觸發程式的所有參考,併發生錯誤。