共用方式為


專案設定 (轉換) (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 結構描述。 此設定提供兩個選項:

  1. 結構描述對資料庫:在此模式中,DB2 結構描述「sch1」預設會對應至 SQL Server 資料庫「sch1」中的「dbo」SQL Server 結構描述。

  2. 結構描述對結構描述:在此模式中,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 上所有外部觸發程序的參考,並顯示錯誤。

另請參閱

使用者介面參考 (DB2ToSQL)