Udostępnij za pośrednictwem


Określanie pól i terminatorów wierszy (SQL Server)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Dla pól danych znaków, opcjonalne znaki końcowe pozwalają na oznaczenie końca każdego pola w pliku danych za pomocą terminatora pola i końca każdego wiersza za pomocą terminatora wiersza . Znaki zakończenia są jednym ze sposobów wskazywania programów odczytujących plik danych, w którym kończy się jedno pole lub wiersz, a drugie pole lub wiersz rozpoczyna się.

Ważny

W przypadku korzystania z natywnego lub natywnego formatu Unicode użyj prefiksów długości, a nie terminatorów pól. Dane formatu natywnego mogą powodować konflikt z terminatorami, ponieważ plik danych w formacie natywnym jest przechowywany w wewnętrznym formacie binarnym programu Microsoft SQL Server.

Znaki obsługiwane jako terminatory

Polecenie bcp, instrukcja BULK INSERT i dostawca zestawów wierszy zbiorczych OPENROWSET obsługują różne znaki jako terminatory pól lub wierszy i zawsze wyszukują pierwsze wystąpienie każdego terminatora. W poniższej tabeli wymieniono obsługiwane znaki dla terminatorów.

Znak zakończenia Wskazane przez
Zakładka \t

Jest to domyślny terminator pól.
Znak nowego wiersza \n

Jest to domyślny terminator wierszy.
Powrót karetki/kanał liniowy \r
Ukośnik odwrotny* \|
Terminator o wartości null (nievisible terminator)** \0
Dowolny znak drukowalny (znaki sterujące nie są drukowalne, z wyjątkiem znaku null, tabulacji, znaku nowej linii i powrotu karetki) (*, A, t, l itd.)
Ciąg zawierający maksymalnie 10 znaków nadających się do druku, w tym niektóre lub wszystkie wymienione wcześniej znaki końcowe (**\t**, end, !!!!!!!!!, \t-\nitd.)

*Tylko znaki t, n, r, 0 i "\0" działają ze znakiem ucieczki ukośnika wstecznego, tworząc znak kontrolny.

**Mimo że znak kontrolki o wartości null (\0) nie jest widoczny podczas drukowania, jest to odrębny znak w pliku danych. Oznacza to, że używanie znaku kontrolki o wartości null jako pola lub terminatora wiersza różni się od braku w ogóle pola ani terminatora wierszy.

Ważny

Jeśli znak terminatora występuje w danych, jest interpretowany jako terminator, a nie jako dane, a dane po tym znaku są interpretowane jako należące do następnego pola lub rekordu. W związku z tym należy starannie wybrać terminatory, aby upewnić się, że nigdy nie pojawiają się w danych. Na przykład niski terminator pola zastępczego nie byłby dobrym wyborem dla terminatora pola, jeśli dane zawierają ten niski zastępca.

Korzystanie z terminatorów wierszy

Terminator wiersza może być tym samym znakiem co terminator ostatniego pola. Jednak ogólnie rzecz biorąc, odrębny terminator wiersza jest przydatny. Aby na przykład wygenerować dane wyjściowe tabelaryczne, zakończ ostatnie pole w każdym wierszu znakiem nowego wiersza (\n) oraz wszystkie inne pola znakiem tabulacji (\t). Aby umieścić każdy rekord danych we własnym wierszu w pliku danych, określ kombinację \r\n jako terminator wierszy.

Notatka

Jeśli używasz bcp interaktywnie i określasz \n (nowy wiersz) jako terminator wiersza, bcp automatycznie poprzedza go znakiem \r (powrotu karetki), co skutkuje zakończeniem wiersza \r\n.

Określanie terminatorów dla eksportu zbiorczego

Podczas zbiorczego eksportowania danych char lub nchar i chcesz użyć niestandardowego terminatora, musisz określić terminator w poleceniu bcp. Terminatory można określić na dowolny z następujących sposobów:

  • Za pomocą pliku formatu, który określa terminator dla każdego pola z osobna.

    Notatka

    Aby uzyskać informacje na temat używania plików formatu, zobacz Format Files for Importing or Export Data (SQL Server).

  • Bez pliku formatu istnieją następujące alternatywy:

    • Za pomocą przełącznika -t określ terminator pól dla wszystkich pól z wyjątkiem ostatniego pola w wierszu i używając przełącznika -r, aby określić terminator wierszy.

    • Używanie przełącznika formatu znaków (-c lub -w) bez użycia przełącznika -t, który ustawia terminator pola na znak tabulatora, \t. Jest to takie samo, jak określanie -t\t.

      Notatka

      Jeśli określisz przełącznik -n (dane natywne) lub -N (natywny Unicode), terminatory nie są wstawiane.

    • Jeśli interakcyjne polecenie bcp zawiera opcję in lub out bez przełącznika pliku formatu (-f) lub przełącznika formatu danych (-n, -c, -wlub -N), i nie wybrano określenia długości prefiksu i długości pola, polecenie wywołuje żądanie dla terminatora każdego pola, gdy domyślną jest brak.

      Enter field terminator [none]:

      Ogólnie rzecz biorąc, wartość domyślna jest odpowiednim wyborem. Jednak w przypadku char lub nchar pól danych, zobacz następującą podsekcję "Wytyczne dotyczące używania terminatorów". Aby uzyskać przykład pokazujący ten monit w kontekście, zobacz Określanie formatów danych pod kątem zgodności podczas korzystania z narzędzia bcp (SQL Server).

      Notatka

      Po interakcyjnym określeniu wszystkich pól w poleceniu bcp, zostaniesz poproszony o zapisanie odpowiedzi dla każdego pola w pliku w formacie innym niż XML. Aby uzyskać więcej informacji na temat plików w formacie innych niż XML, zobacz pliki formatujące inne niż XML (SQL Server).

Wskazówki dotyczące używania terminatorów

W niektórych sytuacjach terminator jest przydatny w przypadku znaku lub nchar pola danych. Na przykład:

  • W przypadku kolumny danych zawierającej wartość null w pliku danych, który zostanie zaimportowany do programu, który nie rozumie informacji o długości prefiksu.

    Każda kolumna danych zawierająca wartość null jest uznawana za zmienną długość. W przypadku braku długości prefiksów terminator jest niezbędny do zidentyfikowania końca pola o wartości null, upewniając się, że dane są prawidłowo interpretowane.

  • W przypadku długiej kolumny o stałej długości, której przestrzeń jest używana tylko częściowo przez wiele wierszy.

    W takiej sytuacji określenie terminatora może zminimalizować ilość miejsca do magazynowania, dzięki czemu pole będzie traktowane jako pole o zmiennej długości.

Określ \n jako terminator wiersza dla eksportu zbiorczego

Jeśli określisz \n jako terminator wierszy dla eksportu zbiorczego lub niejawnie użyjesz domyślnego terminatora wierszy, narzędzie bcp wyprowadza kombinację zestawienia wiersza powrotnego karetki (CRLF) jako terminator wiersza. Jeśli chcesz wyświetlić tylko znak przejścia do nowej linii (LF) jako terminator wiersza — co jest typowe na komputerach z systemami Unix i Linux — użyj notacji szesnastkowej, aby określić terminator wiersza LF. Na przykład:

bcp -r '0x0A'

Przykłady

W tym przykładzie dane są eksportowane zbiorczo z tabeli AdventureWorks.HumanResources.Department do pliku danych Department-c-t.txt przy użyciu formatu znaków z przecinkiem jako terminatorem pola i znakiem nowego wiersza (\n) jako terminatorem wiersza.

Polecenie bcp zawiera następujące przełączniki.

Przełącznik Opis
-c Określa, że pola danych mają być ładowane jako dane znaków.
-t, Określa przecinek (,) jako terminator pola.
-r \n Określa terminator wierszy jako znak przejścia do nowego wiersza. Jest to domyślny terminator wierszy, dlatego określenie go jest opcjonalne.
-T Określa, że narzędzie bcp łączy się z programem SQL Server poprzez zaufane połączenie z wykorzystaniem zintegrowanych mechanizmów uwierzytelniania. Jeśli nie określono -T, należy określić -U i -P, aby pomyślnie się zalogować.

Aby uzyskać więcej informacji, zobacz narzędzie bcp .

W wierszu polecenia systemu Microsoft Windows wprowadź:

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

Spowoduje to utworzenie Department-c-t.txt, który zawiera 16 rekordów z czterema polami. Pola są oddzielone przecinkami.

Określanie terminatorów dla importu zbiorczego

Podczas zbiorczego importowania danych, takich jak char lub nchar, komenda importu zbiorczego musi rozpoznać terminatory używane w pliku danych. Sposób określenia terminatorów zależy od polecenia importu zbiorczego w następujący sposób:

  • bcp

    Określanie terminatorów dla operacji importowania używa tej samej składni co w przypadku operacji eksportowania. Aby uzyskać więcej informacji, zobacz "Określanie terminatorów dla eksportu zbiorczego", wcześniej w tym rozdziale.

  • WSTAWIANIE ZBIORCZE

    Terminatorzy mogą być określeni dla poszczególnych pól w pliku formatu lub dla całego pliku danych za pomocą kwalifikatorów przedstawionych w poniższej tabeli.

    Kwalifikator Opis
    FIELDTERMINATOR ='field_terminator' Określa terminator pola, który ma być używany dla plików danych znakowych i Unicode.

    Wartość domyślna to \t (znak tabulacji).
    ROWTERMINATOR ='row_terminator' Określa terminator wiersza, który ma być używany dla plików danych znakowych i Unicode.

    Wartość domyślna to \n (znak nowego wiersza).

    Aby uzyskać więcej informacji, zobacz BULK INSERT (Transact-SQL).

  • WSTAWIAĆ... SELECT * FROM OPENROWSET(BULK...)

    W przypadku dostawcy dużych zestawów wierszy OPENROWSET terminatory można określić tylko w pliku formatowania (który jest wymagany z wyjątkiem typów danych dużych obiektów). Jeśli plik danych znaków używa niedomyślnego terminatora, musi być zdefiniowany w pliku formatu. Aby uzyskać więcej informacji, zobacz Utwórz plik formatu (SQL Server) oraz Użyj pliku formatu do masowego importu danych (SQL Server).

    Aby uzyskać więcej informacji na temat klauzuli BULK OPENROWSET, zobacz OPENROWSET (Transact-SQL).

Określanie \n jako znacznik końca wiersza dla wczytywania zbiorczego

Po określeniu \n jako terminatora wierszy do importu zbiorczego lub poprzez niejawne użycie domyślnego terminatora wierszy, bcp i instrukcja BULK INSERT oczekują kombinacji powrotu karetki i zakończenia wiersza (CRLF) jako terminatora wiersza. Jeśli plik źródłowy używa tylko znaku nowej linii (LF) jako znaku końca wiersza — co jest typowe dla plików generowanych na komputerach z systemami Unix i Linux — użyj notacji szesnastkowej, aby określić znak końca wiersza LF. Na przykład w instrukcji BULK INSERT:

 ROWTERMINATOR = '0x0A'

Przykłady

Przykłady w tej sekcji pokazują, jak zbiorczo importować dane znakowe z pliku danych Department-c-t.txt utworzonego w poprzednim przykładzie do tabeli myDepartment w przykładowej bazie danych AdventureWorks2022. Przed uruchomieniem przykładów należy utworzyć tę tabelę. Aby utworzyć tę tabelę w schemacie dbo, w Edytorze zapytań programu SQL Server Management Studio wykonaj następujący kod:

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. Używanie narzędzia bcp do interakcyjnego określania terminatorów

Poniższy przykład zbiorczo importuje plik danych Department-c-t.txt przy użyciu polecenia bcp. To polecenie używa tych samych przełączników poleceń co polecenie eksportu zbiorczego. Aby uzyskać więcej informacji, zobacz "Określanie terminatorów dla eksportu zbiorczego," we wcześniejszej części tego tematu.

W wierszu polecenia systemu Windows wprowadź:

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

B. Używanie funkcji BULK INSERT w celu interakcyjnego określania terminatorów

Poniższy przykład zbiorczo importuje plik danych Department-c-t.txt przy użyciu instrukcji BULK INSERT, która używa kwalifikatorów pokazanych w poniższej tabeli.

Opcja Atrybut
DATAFILETYPE ='char' Określa, że pola danych mają być ładowane jako dane znaków.
FIELDTERMINATOR =',' Określa przecinek (,) jako terminator pola.
ROWTERMINATOR ='\n' Określa znak końca wiersza jako znak nowego wiersza.

W edytorze zapytań programu SQL Server Management Studio wykonaj następujący kod:

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

Następne kroki