疑難排解資料產生問題
更新:2007 年 11 月
當您處理資料產生計劃時,可能會遇到以下問題:
無法開啟資料產生計劃
違反檢查條件約束時,資料產生會失敗
無法將規則運算式資料產生器指派給使用者定義型別資料行
無法針對具有刪除觸發程序的資料表產生資料
資料繫結產生器的問題
無法開啟資料產生計劃
如果在現有資料產生計劃中找不到指派給資料行的資料產生器,您就無法開啟此計劃,而且會出現下列錯誤訊息:
無法載入 FileName.dgen。找不到型別為 GeneratorName 的可用產生器。請手動編輯並重新載入 dgen 檔案,以修正錯誤。
以下是這個錯誤的某些可能原因與解決方式:
資料產生器的類別名稱已經變更。如果只有變更名稱,您可以在文字編輯器中開啟 .dgen 檔案,然後手動變更 XML。您必須將受到影響之資料行的資料產生器名稱變更為新的名稱。
此資料產生器已被取代。您可以在文字編輯器中開啟 .dgen 檔案,然後手動變更 XML。在此情況下,您應該從所有受到影響之資料行的 XML 中移除完整的 <ColumnConfig> 項目 (以及所有子項目)。在 Visual Studio 中開啟資料產生計劃,並接受結構描述變更。預設的資料產生器會指派給受到影響的資料行;您也必須重新選取受到影響的資料行,才能將其包含在資料產生計劃中。如需詳細資訊,請參閱 HOW TO:指定要產生資料的資料行。
會從 extensions.xml 檔案中移除資料產生器的項目;您必須變更 extensions.xml 檔案,並為資料產生器加入 <extensions> 項目。你必須關閉並且重新啟動程式Visual Studio,變更才會生效。
.dll 檔案和 extensions.xml 檔案不再同步。extensions.xml 檔案所定義的 .dll 檔案中沒有資料產生器;您必須重新部署正確版本的組件和 Extensions.xml 檔案,才能修正這個問題。您必須關閉並且重新啟動程式 Visual Studio,變更才會生效。
違反檢查條件約束時,資料產生會失敗
當您針對具有檢查條件約束的資料行產生資料時,如果產生的資料違反此條件約束,則產生作業會失敗。在您執行計劃之前,可以使用 [資料產生預覽] 視窗來查看資料是否違反此條件約束。如需詳細資訊,請參閱 HOW TO:預覽資料產生計畫。
若要修正這個問題,您必須使用下列其中一個方法:
使用 Min 和 Max 屬性可控制資料產生的方式。例如,假設您的資料表有兩個資料行 (命名為 StartDate 和 EndDate) 及一個檢查條件約束 (StartDate 必須在 EndDate 的前面)。您可以將 StartDate 資料行的 Max 屬性設定為小於 EndDate 資料行的 Min 屬性,以達成您的目標。如需詳細資訊,請參閱為資料行指定資料產生的詳細資料。
使用資料繫結產生器。如需詳細資訊,請參閱資料繫結產生器。
使用自訂資料產生器。如需詳細資訊,請參閱建立自訂資料產生器。
無法將規則運算式資料產生器指派給具有唯一條件約束的使用者定義型別資料行
當您嘗試將資料產生器指派給具有唯一條件約束的資料行時,可用產生器的清單只會顯示可以產生唯一值的產生器。由於無法保證規則運算式產生器一定會產生唯一的值,所以您不能使用它來填滿具有唯一條件約束的使用者定義型別資料行。若要產生具有唯一條件約束的使用者定義型別資料行,您必須使用資料繫結產生器或自訂資料產生器。如需詳細資訊,請參閱資料繫結產生器和建立自訂資料產生器。
無法針對具有刪除觸發程序的資料表產生資料
某些資料表的觸發程序會讓您無法刪除這些資料表中的資料列;如果您嘗試刪除這類資料表中的資料列,該觸發程序將會復原刪除作業。因此,您無法在正常情況下針對這類資料表或是參考這類資料表的資料表來產生資料。例如,您無法在正常情況下針對 AdventureWorks 資料庫中的 Employee 資料表產生資料。
若要產生這類資料表的資料,請使用下列其中一個方法:
刪除此觸發程序、執行資料產生計劃,然後重新加入此觸發程序。
執行資料產生計劃。當系統提示您是否要在插入新的資料列之前,清除資料表的內容時,請按一下 [否]。您所產生的新資料就會加入到資料表的任何現有資料中,如此一來,刪除觸發程序就不會發生。這個方法可能會產生無法預期的結果,而且當任何一個資料行有唯一的條件約束時,可能會發生錯誤。
資料繫結產生器的問題
如果因為已經指定資料繫結產生器的一個或多個資料行造成資料產生失敗,[資料行詳細資料] 視窗中的 [產生器輸出] 資料行會顯示「沒有輸出」或「沒有可強迫的輸出」。下列章節將描述這種資料產生失敗的原因。
沒有輸出
如果 [產生器輸出] 資料行顯示「沒有輸出」,您在 [Select Query] 屬性中指定的 SELECT 陳述式可能不正確。因為不容易在 [屬性] 視窗中查看 SELECT 陳述式,您可能會想要複製陳述式並貼至 Transact-SQL (T-SQL) 編輯器中,以確認陳述式是否正確。
沒有可強迫的輸出
如果 [產生器輸出] 資料行顯示「沒有可強迫的輸出」,表示 SELECT 陳述式傳回的資料型別無法強制轉型成正進行資料產生的資料行資料型別。例如,如果您想要產生型別為 INT 之資料行的資料,下列 SELECT 陳述式將導致「沒有可強迫的輸出」的出現:
SELECT RAND() * (column1 - column2) AS Column1 FROM Table1
您必須更新 SELECT 陳述式,以傳回可強制轉型成 INT 的資料,如下所示:
SELECT CAST(RAND() * (column1 - column2) AS INT) AS Column1 FROM Table1
如需 SELECT 和其他 T-SQL 陳述式的詳細資訊,請參閱 Microsoft 網站上的 Transact-SQL 參考 (資料庫引擎)。