共用方式為


指定欄位與資料列結束字元 (SQL Server)

適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

針對字元資料欄位,選擇性結束字元可讓您使用「欄位結束字元」 標示資料檔案中每個欄位的結尾,並使用「資料列結束字元」 標示每個資料列的結尾。 終止字元是一種方法,用於向程式指示數據檔案中一個欄位或資料列結束,而另一個欄位或資料列開始的位置。

重要

在使用原生或 Unicode 原生格式時,請使用長度前綴,而不使用欄位結束字元。 由於原生格式資料檔案存放格式為 Microsoft SQL Server 的內部二進位資料格式,因此原生格式資料可能會與結束字元相衝突。

支援作為結束符的字元

bcp 命令、BULK INSERT 陳述式與 OPENROWSET 大量資料列集提供者,都支援多種字元作為欄位或資料列終止符號,且一律會尋找每個終止符號的第一次出現。 下表列出支援作為終結符號的字元。

結束字元 由...表示
索引標籤 \t

這是預設欄位結束字元。
新行字元 (Newline Character) \n

這是預設資料列結束字元。
歸位字元/換行字元 \r
反斜線* \|
Null 結束字元 (看不見的結束字元)** \0
任何可列印的字元 (除了 Null 值、定位點、新行字元和 Return 鍵外,控制字元均無法列印) (*、A、t、l 等等)
最多包含 10 個可列印字元的字串,包括先前所列的一些或所有結束字元 (**\t**、end、!!!!!!!!!!、\t-\n 等等)

*只有 t、n、r、0 和 '\0' 字元可以與反斜線逸出字元搭配使用,以產生控制字元。

**雖然列印時看不到 null 控制字元 (\0),這個字元仍是資料檔中的個別字元。 這表示使用 null 控制字元做為欄位或資料列結束字元,和完全沒有欄位或資料列結束字元不同。

重要

如果在資料內發現結束字元,它會當作結束字元而非當作資料來解譯,而該字元之後的資料則會解譯為屬於下一個欄位或記錄。 因此,請謹慎選擇終止符,確保它們絕不會出現在您的資料中。 例如,如果資料中包含低位代理,則使用此低位代理作為欄位結束字元就不是一個好的選擇。

使用資料列終止符

資料列結束字元可以和最後一個欄位的結束字元相同。 不過,明確的資料列終止符通常相當有用。 例如,若要產生表格式輸出,請以新行字元 (\n) 結束每個資料列的最後一個欄位,並以定位字元 (Tab) 結束所有其他欄位。 若要將每個資料紀錄放置在資料檔中的單獨一行,請指定 \r\n 組合作為列終止符。

注意

以互動方式使用 bcp 並指定 \n (換行) 作為資料列結束字元時,bcp 會自動在前面加入 \r (歸位字元),因此產生的資料列結束字元為 \r\n。

指定批量匯出時使用的終止符號

當您大量匯出 charnchar 資料,而且想要使用非預設的結束字元時,就必須對 bcp 命令指定結束字元。 您可以使用下列方式指定結束字元:

  • 使用格式檔案,以逐個欄位指定終結符號。

    如需格式檔案的詳細資訊,請參閱匯入或匯出資料的格式檔案 (SQL Server)

  • 不使用格式檔案,可使用下列替代方法:

    • 使用 -t 參數,對資料列中最後一個欄位以外的所有欄位,指定欄位結束字元,並使用 -r 參數指定資料列結束字元。

    • 使用字元格式切換 (-c-w) 而不使用 -t 切換,這會將欄位終止符設為定位字元 \t。 這與指定 -t\t 相同。

      注意

      如果您指定 -n (原生資料) 或 -N (Unicode 原生) 參數,則不會插入結束字元。

    • 如果互動式 bcp 命令包含 inout 選項,但不使用格式檔案參數 ( -f) 或資料格式參數 ( -n-c-w,或 -N),而且您選擇不指定前置長度與欄位長度,則該命令會提示輸入每個欄位的欄位結束字元 (預設是無):

      Enter field terminator [none]:

      預設值通常是適合的選擇。 不過,對於 charnchar 資料欄位,請參閱此小節:「終止符使用指導方針」。如需顯示此提示的範例,請參閱 當使用 bcp 時指定相容性的資料格式 (SQL Server)

      注意

      以互動方式在 bcp 命令中指定所有欄位之後,此命令會提示您將每個欄位的回應以非 XML 格式的檔案加以儲存。 如需非 XML 格式檔案的詳細資訊,請參閱非 XML 格式檔案 (SQL Server)

使用終止符的指導方針

在某些情況中,結束字元對 charnchar 資料欄位而言很有用。 例如:

  • 資料檔中的資料行包含 Null 值,而此資料檔將要匯入至不了解前置長度資訊的程式。

    包含 Null 值的任何資料行會被視為可變長度。 如果沒有使用前置長度,則需要使用結束符號來識別 Null 欄位的結尾,以確保資料被正確解譯。

  • 許多資料列只使用其部分空間的固定長度長資料行。

    在這種狀況下,指定結束字元可縮小儲存空間,允許欄位視為可變長度欄位。

針對大量匯出指定 \n 作為資料列結束字元

當您針對大量匯出指定 \n 做為資料列結束字元,或以隱含方式使用預設的資料列結束字元時,bcp 會輸出歸位字元與換行字元的組合 (CRLF) 做為資料列結束字元。 如果您想只輸出換行字元(LF)作為列結束符號(這在 Unix 和 Linux 電腦上很常見),請使用十六進位表示來指定 LF。 例如:

bcp -r '0x0A'

範例

此範例會使用字元格式、以逗號作為欄位結束字元,而且以新行字元 (\n) 作為資料列結束字元,將資料從 AdventureWorks.HumanResources.Department 資料表大量匯出資料至 Department-c-t.txt 資料檔案。

bcp 命令包含下列參數。

開關 描述
-c 指定將資料欄位以字元資料類型載入。
-t, 指定逗號 (,) 做為欄位結束字元。
-r \n 指定資料列結束字元為新行字元。 此為預設資料列結束字元,因此可選擇性地加以指定。
-T 指定 bcp 公用程式使用整合式安全性的受信任連線,連線到 SQL Server。 如果未指定 -T ,則必須指定 -U-P ,才能順利登入。

如需相關資訊,請參閱 bcp Utility

在 Microsoft Windows 命令提示字元中,輸入:

bcp AdventureWorks.HumanResources.Department out C:\myDepartment-c-t.txt -c -t, -r \n -T

這會建立 Department-c-t.txt,四個欄位中各包含 16 筆記錄。 這些欄位會以逗號隔開。

指定大量匯入的結束符號

當您大量匯入 charnchar 資料時,大量匯入命令必須辨識資料檔案中使用的結束字元。 指定結束字元的方式因不同的大量匯入命令而異,如下所示:

  • bcp

    指定匯入作業結束字元所使用的語法,與用於匯出作業的語法相同。 如需詳細資訊,請參閱本主題前面的「指定大量匯出的結束字元」。

  • BULK INSERT (批量插入)

    您可以使用下表所示的限定詞,針對格式檔案中的個別欄位或整個資料檔指定結束字元。

    限定詞 描述
    FIELDTERMINATOR ='field_terminator' 指定用於字元和 Unicode 字元資料檔中的欄位終止符。

    預設是 '\t' (製表字元)。
    ROWTERMINATOR ='row_terminator' 指定要用於字元和 Unicode 字元資料檔中的資料列結束字元。

    預設值是 \n (新行字元)。

    如需詳細資訊,請參閱 BULK INSERT (Transact-SQL)

  • INSERT ...SELECT * FROM OPENROWSET(BULK...)

    針對 OPENROWSET 大量資料列集提供者,終止符只能在格式檔中指定,格式檔是必要的,唯獨大型物件資料類型除外。 如果字元資料檔使用非預設結束字元,則必須在格式檔案中加以定義。 如需詳細資訊,請參閱建立格式檔案 (SQL Server)使用格式檔案大量匯入資料 (SQL Server)

    如需有關 OPENROWSET BULK 子句的詳細資訊,請參閱 OPENROWSET (Transact-SQL)

針對大量匯入指定 \n 作為資料列結束字元

當您針對大量匯入指定 \n 做為資料列結束字元,或以隱含方式使用預設的資料列結束字元,bcp 與 BULK INSERT 陳述式預期使用歸位字元與換行字元的組合 (CRLF) 做為資料列結束字元。 若您的原始程式碼檔案只使用換行字元 (LF) 做為資料列結束字元 (在於 Unix 與 Linux 電腦上產生的檔案中很常見),請使用十六進位標記法來指定 LF 資料列結束字元。 例如,在 BULK INSERT 陳述式中:

 ROWTERMINATOR = '0x0A'

範例

這一節中的範例會將字元資料從先前範例中建立的 Department-c-t.txt 資料檔案,大量匯入到 myDepartment 範例資料庫中的 AdventureWorks2022 資料表。 您必須先建立這個資料表,才能執行範例。 在 dbo 結構描述下建立這個資料表時,請在 SQL Server Management Studio 查詢編輯器中執行下列程式碼:

USE AdventureWorks2022;
GO
DROP TABLE myDepartment;
CREATE TABLE myDepartment
(DepartmentID smallint,
Name nvarchar(50),
GroupName nvarchar(50) NULL,
ModifiedDate datetime not NULL CONSTRAINT DF_AddressType_ModifiedDate DEFAULT (GETDATE())
);
GO

A. 使用 bcp 以互動方式指定結束字元

下列範例會使用 Department-c-t.txt 命令,大量匯入 bcp 資料檔。 此命令與大量匯出命令使用相同的命令參數。 如需詳細資訊,請參閱本主題中前面的「指定大量匯出的終止符號」。

在 Windows 命令提示字元上輸入:

bcp AdventureWorks2022..myDepartment in C:\myDepartment-c-t.txt -c -t , -r \n -T

B. 使用 BULK INSERT 以互動方式指定結束字元

下列範例會使用 Department-c-t.txt 陳述式 (其中使用下表所示的限定詞),大量匯入 BULK INSERT 資料檔。

選項 屬性
DATAFILETYPE =' char ' 指定資料欄位應以字元資料載入。
FIELDTERMINATOR =',' 指定逗號 (,) 作為欄位結束字元。
ROWTERMINATOR ='\n' 指定資料列結束字元為新行字元。

在 SQL Server Management Studio 查詢編輯器 中,執行下列程式碼:

USE AdventureWorks2022;
GO
BULK INSERT myDepartment FROM 'C:\myDepartment-c-t.txt'
     WITH (
     DATAFILETYPE = 'char',
     FIELDTERMINATOR = ',',
     ROWTERMINATOR = '\n'
);
GO

下一步