格式檔案簡介
與特定資料表相關聯之資料檔中每一個欄位的格式資訊會儲存在一個檔案中,這個檔案就稱為「格式檔案」(Format File)。格式檔案可提供大量匯出或大量匯入資料所需的所有格式資訊。格式檔案提供可用來寫入資料檔案的彈性系統,幾乎不需要進行編輯,即可符合其他資料格式或從其他軟體中讀取資料檔。
在 MicrosoftSQL Server 2000 和舊版本中,大量匯出和匯入作業使用單一類型的格式檔案。這仍然受到支援。但是,SQL Server 2005 及更新的版本另外也支援 XML 格式檔案。原始類型的格式檔案稱為「非 XML 格式檔案」。
所有格式檔案都有資料檔中每一個欄位的描述,XML 格式檔案還包含對應資料表資料行的描述。一般而言,XML 和非 XML 格式檔案可以互換使用,但是仍建議您在新的格式檔案中使用 XML 語法,因為 XML 比非 XML 格式檔案多了一些優點。XML 格式檔案具有下列特性:
具有自我描述能力且易於閱讀、建立及擴充。
包含目標資料行的資料類型。
如此可將資料檔呈現資料的方式,與檔案中每一個欄位和資料類型間的關係,予以區隔開來。例如,資料檔若包含資料的字元表示法,就會遺失對應的 SQL 資料行類型。
bcp 命令和 BULK INSERT 陳述式使用目標資料表資料行來執行類型轉換,因此目標資料表是必要的。反之,OPENROWSET(BULK...) 函數要依賴 XML 格式檔案,才能從資料檔讀取資料,因此目標資料表是選用的。
允許從資料檔載入包含單一大型物件 (LOB) 資料類型的欄位。
格式檔案的語法與作業方向無關;也就是說,不管是大量匯出還是大量匯入作業,語法都相同。
如需有關每個格式檔案類型的配置的詳細資訊,請參閱本主題後面的<範例>。
何時需要格式檔案?
INSERT ...SELECT * FROM OPENROWSET(BULK...) 陳述式永遠需要格式檔案。
- 至於 bcp 或 BULK INSERT,在簡單的情況下,可以選擇是否使用格式檔案,且很少會需要。不過,在複雜的大量匯入情況下,就經常需要格式檔案。
下列情況需要格式檔案:
多個具有不同結構描述的資料表,使用同一個資料檔做為來源。
資料檔的欄位數目和目標資料表的資料行數目不同;例如:
目標資料表至少有一個資料行,其中定義了預設值或允許 NULL。
使用者在資料表中的一個或多個資料行上沒有 SELECT/INSERT 權限。
兩個以上具有不同結構描述的資料表,使用單一資料檔。
資料檔與資料表的資料行順序不同。
資料檔的資料行之間,有不同的終止字元或前置長度。
[!附註]
在沒有格式檔案的情況下,如果 bcp 命令指定了資料格式參數 (-n、-c、-w 或 -N),或 BULK INSERT 作業指定了 DATAFILETYPE 選項,則會採用指定的資料格式來做為解譯資料檔欄位的預設方法。
範例
下列範例顯示非 XML 格式檔案及 XML 格式檔案的配置。這些格式檔案會對應到 AdventureWorks 範例資料庫中的 HumanResources.myTeam 資料表。這個資料表包含四個資料行:EmployeeID、Name、Title 和 ModifiedDate。
[!附註]
如需有關如何建立此資料表及此資料表的詳細資訊,請參閱<建立 HumanResources.myTeam 資料表>。
A. 使用非 XML 格式檔案
下列非 XML 格式檔案使用 HumanResources.myTeam 資料表的 SQL Server 原生資料格式。這個格式檔案是使用下列 bcp 命令所建立。
bcp AdventureWorks.HumanResources.myTeam format nul -f myTeam.Fmt -n -T
The contents of this format file are as follows: 9.0
4
1 SQLSMALLINT 0 2 "" 1 EmployeeID ""
2 SQLNCHAR 2 100 "" 2 Name SQL_Latin1_General_CP1_CI_AS
3 SQLNCHAR 2 100 "" 3 Title SQL_Latin1_General_CP1_CI_AS
4 SQLNCHAR 2 100 "" 4 Background SQL_Latin1_General_CP1_CI_AS
如需詳細資訊,請參閱<了解非 XML 格式檔案>。
B. 使用 XML 格式檔案
下列 XML 格式檔案使用 HumanResources.myTeam 資料表的 SQL Server 原生資料格式。這個格式檔案是使用下列 bcp 命令所建立。
bcp AdventureWorks.HumanResources.myTeam format nul -f myTeam.Xml -x -n -T
格式檔案包含:
<?xml version="1.0"?>
<BCPFORMAT xmlns="https://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="NativePrefix" LENGTH="1"/>
<FIELD ID="2" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="3" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="4" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="EmployeeID" xsi:type="SQLSMALLINT"/>
<COLUMN SOURCE="2" NAME="Name" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="3" NAME="Title" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="4" NAME="Background" xsi:type="SQLNVARCHAR"/>
</ROW>
</BCPFORMAT>
如需詳細資訊,請參閱<瞭解 XML 格式檔案>。