Udostępnij za pomocą


Importowanie lub eksportowanie danych (SQL Server) przy użyciu formatu natywnego

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

Format natywny jest zalecany podczas zbiorczego transferu danych między wieloma wystąpieniami programu SQL Server przy użyciu pliku danych, który nie zawiera żadnych znaków zestawu znaków rozszerzonych/dwubajtowych (DBCS).

Notatka

Aby zbiorczo przesyłać dane między wieloma wystąpieniami programu SQL Server przy użyciu pliku danych zawierającego znaki rozszerzone lub DBCS, należy użyć formatu natywnego Unicode. Aby uzyskać więcej informacji, zobacz Używanie formatu natywnego Unicode do importowania lub eksportowania danych (SQL Server).

Format natywny obsługuje natywne typy danych bazy danych. Format natywny jest przeznaczony do szybkiego transferu danych między tabelami programu SQL Server. Jeśli używasz pliku formatu, tabele źródłowe i docelowe nie muszą być identyczne. Transfer danych obejmuje dwa kroki:

  1. Zbiorcze eksportowanie danych z tabeli źródłowej do pliku danych

  2. Zbiorcze importowanie danych z pliku danych do tabeli docelowej

Użycie formatu natywnego między identycznymi tabelami pozwala uniknąć niepotrzebnej konwersji typów danych do i z formatu znaków, co pozwala zaoszczędzić czas i miejsce. Aby osiągnąć optymalną szybkość transferu, jednak niewiele kontroli jest wykonywanych w odniesieniu do formatowania danych. Aby zapobiec problemom z załadowanymi danymi, zobacz poniższą listę ograniczeń.

Ograniczenia

Aby pomyślnie zaimportować dane w formacie natywnym, upewnij się, że:

  • Plik danych jest w formacie natywnym.

  • Albo tabela docelowa musi być zgodna z plikiem danych (z prawidłową liczbą kolumn, typem danych, długością, stanem NULL itd.) lub musisz użyć pliku formatu, aby zamapować każde pole na odpowiednie kolumny.

    Notatka

    W przypadku importowania danych z pliku, który jest niezgodny z tabelą docelową, operacja importowania może zakończyć się powodzeniem, ale wartości danych wstawione do tabeli docelowej mogą być niepoprawne. Wynika to z faktu, że dane z pliku są interpretowane przy użyciu formatu tabeli docelowej. W związku z tym każda niezgodność powoduje wstawienie nieprawidłowych wartości. Jednak w żadnym wypadku taka niezgodność może spowodować logiczne lub fizyczne niespójności w bazie danych.

    Aby uzyskać informacje na temat używania plików formatu, zobacz Formatowanie plików do importowania lub eksportowania danych (SQL Server).

Pomyślne zaimportowanie nie spowoduje uszkodzenia tabeli docelowej.

Jak narzędzie bcp obsługuje dane w formacie natywnym

W tej sekcji omówiono specjalne zagadnienia dotyczące sposobu eksportowania i importowania danych w formacie natywnym przez narzędzie bcp.

  • Dane nietypowe

    Narzędzie bcp używa wewnętrznego formatu danych binarnych programu SQL Server do zapisywania danych nieliterowych z tabeli do pliku danych.

  • char lub varchar typ danych

    Na początku każdego pola char lub varchar, bcp dodaje długość prefiksu.

    Ważny

    Gdy jest używany tryb macierzysty, domyślnie narzędzie bcp konwertuje znaki z programu SQL Server na znaki OEM, zanim skopiuje je do pliku danych. Narzędzie bcp konwertuje znaki z pliku danych na znaki ANSI, zanim zbiorczo zaimportuje je do tabeli programu SQL Server. Podczas tych konwersji można utracić rozszerzone dane znaków. W przypadku znaków rozszerzonych użyj formatu natywnego Unicode lub określ stronę kodową.

  • sql_variant typ danych

    Jeśli sql_variant dane są przechowywane jako SQLVARIANT w pliku danych w formacie natywnym, dane zachowują wszystkie jego cechy. Metadane, które rejestrują typ danych każdej wartości danych, są przechowywane wraz z wartością danych. Te metadane służą do ponownego tworzenia wartości danych o tym samym typie danych w docelowej kolumnie sql_variant.

    Jeśli typ danych kolumny docelowej nie jest sql_variant, każda wartość danych jest konwertowana na typ danych kolumny docelowej, zgodnie z normalnymi regułami niejawnej konwersji danych. Jeśli podczas konwersji danych wystąpi błąd, bieżąca partia zostanie wycofana. Wszystkie wartości char i varchar przesyłane między kolumnami sql_variant mogą mieć problemy z konwersją strony kodu.

    Aby uzyskać więcej informacji na temat konwersji danych, zobacz Konwersja typu danych (Aparat bazy danych).

Opcje poleceń dla formatu natywnego

Dane w formacie natywnym można zaimportować do tabeli przy użyciu bcp, BULK INSERT lub INSERT ... SELECT * FROM OPENROWSET(BULK...). W przypadku polecenia bcp lub instrukcji BULK INSERT można określić format danych w instrukcji . W przypadku instrukcji INSERT... SELECT * FROM OPENROWSET(BULK...) trzeba określić format danych w pliku formatu.

Format natywny jest obsługiwany przez następujące opcje polecenia:

Polecenie Opcja Opis
bcp -n Powoduje, że narzędzie bcp używa natywnych typów danych.*
BULK INSERT DATAFILETYPE ='native' Używa natywnych lub szerokich natywnych typów danych danych. DATAFILETYPE nie jest wymagane, jeśli plik formatu określa typy danych.
OPENROWSET N/A Musi używać pliku formatu

* Aby załadować dane natywne (-n) do formatu zgodnego z wcześniejszymi wersjami klientów programu SQL Server, użyj przełącznika -V . Aby uzyskać więcej informacji, zobacz Importowanie danych w formacie natywnym i znakowym z wcześniejszych wersji SQL Server.

Notatka

Alternatywnie można określić formatowanie dla poszczególnych pól w pliku formatu. Aby uzyskać więcej informacji, zobacz Pliki formatu do importu lub eksportu danych (SQL Server).

Przykładowe warunki testu

W przykładach użyto plików bazy danych i formatu utworzonych w tym artykule.

Przykładowa tabela

Poniższy skrypt tworzy testową bazę danych, tabelę o nazwie myNative i wypełnia tabelę kilkoma wartościami początkowymi. Wykonaj polecenie Transact-SQL w programie Microsoft SQL Server Management Studio (SSMS):

CREATE DATABASE TestDatabase;
GO

USE TestDatabase;
CREATE TABLE dbo.myNative ( 
   PersonID smallint NOT NULL,
   FirstName varchar(25) NOT NULL,
   LastName varchar(30) NOT NULL,
   BirthDate date,
   AnnualSalary money
   );

-- Populate table
INSERT TestDatabase.dbo.myNative
VALUES 
(1, 'Anthony', 'Grosse', '1980-02-23', 65000.00),
(2, 'Alica', 'Fatnowna', '1963-11-14', 45000.00),
(3, 'Stella', 'Rossenhain', '1992-03-02', 120000.00);

-- Review Data
SELECT * FROM TestDatabase.dbo.myNative;

Przykładowy plik formatu innego niż XML

Program SQL Server obsługuje dwa typy plików formatu: format inny niż XML i format XML. Format inny niż XML jest oryginalnym formatem obsługiwanym przez wcześniejsze wersje programu SQL Server. Aby uzyskać szczegółowe informacje, zapoznaj się z tematem Używanie plików formatu innego niż XML (SQL Server). Następujące polecenie użyje narzędzia bcp do wygenerowania pliku formatu innego niż xml, myNative.fmt, na podstawie schematu myNative. Aby użyć polecenia bcp w celu utworzenia pliku formatu, określ argument format i użyj nul zamiast ścieżki pliku danych. Opcja formatowania wymaga również opcji -f. Ponadto w tym przykładzie kwalifikator c służy do określania danych znaków, a T służy do określania zaufanego połączenia przy użyciu zintegrowanych zabezpieczeń. W wierszu polecenia wprowadź następujące polecenia:

bcp TestDatabase.dbo.myNative format nul -f D:\BCP\myNative.fmt -T 

REM Review file
Notepad D:\BCP\myNative.fmt

Ważny

Upewnij się, że plik w formacie innym niż XML kończy się znakiem powrotu karetki i znakiem nowej linii. W przeciwnym razie prawdopodobnie zostanie wyświetlony następujący komunikat o błędzie:

SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]I/O error while reading BCP format file

Przykłady

W przykładach użyto plików bazy danych i formatu utworzonych w tym artykule.

Eksportowanie danych przy użyciu narzędzia bcp i formatu natywnego

Przełącznik -n i polecenie OUT.

Plik danych utworzony w tym przykładzie będzie używany w kolejnych przykładach.

W wierszu polecenia wprowadź następujące polecenia:

bcp TestDatabase.dbo.myNative OUT D:\BCP\myNative.bcp -T -n

REM Review results
NOTEPAD D:\BCP\myNative.bcp

Używanie formatu bcp i natywnego do importowania danych bez pliku formatu

Przełącznik -n i polecenie IN.

W wierszu polecenia wprowadź następujące polecenia:

REM Truncate table (for testing)
SQLCMD -Q "TRUNCATE TABLE TestDatabase.dbo.myNative;"

REM Import data
bcp TestDatabase.dbo.myNative IN D:\BCP\myNative.bcp -T -n

REM Review results
SQLCMD -Q "SELECT * FROM TestDatabase.dbo.myNative;"

Importowanie danych z plikiem formatu innego niż XML przy użyciu formatu bcp i formatu natywnego

Przełączniki -n i -f oraz polecenie IN.

W wierszu polecenia wprowadź następujące polecenia:

REM Truncate table (for testing)
SQLCMD -Q "TRUNCATE TABLE TestDatabase.dbo.myNative;"

REM Import data
bcp TestDatabase.dbo.myNative IN D:\BCP\myNative.bcp -f D:\BCP\myNative.fmt -T

REM Review results
SQLCMD -Q "SELECT * FROM TestDatabase.dbo.myNative;"

Używanie funkcji BULK INSERT i formatu natywnego bez pliku formatu

Argument DATAFILETYPE.

Wykonaj polecenie Transact-SQL w programie Microsoft SQL Server Management Studio (SSMS):

TRUNCATE TABLE TestDatabase.dbo.myNative; -- for testing
BULK INSERT TestDatabase.dbo.myNative
    FROM 'D:\BCP\myNative.bcp'
    WITH (
        DATAFILETYPE = 'native'
        );

-- review results
SELECT * FROM TestDatabase.dbo.myNative;

Używanie funkcji BULK INSERT i formatu natywnego z plikiem formatu innego niż XML

Argument FORMATFILE.

Wykonaj polecenie Transact-SQL w programie Microsoft SQL Server Management Studio (SSMS):

TRUNCATE TABLE TestDatabase.dbo.myNative; -- for testing
BULK INSERT TestDatabase.dbo.myNative
   FROM 'D:\BCP\myNative.bcp'
   WITH (
        FORMATFILE = 'D:\BCP\myNative.fmt'
        );

-- review results
SELECT * FROM TestDatabase.dbo.myNative;

Użyj OPENROWSET i formatu natywnego z plikiem formatu innym niż XML

Argument FORMATFILE.

Wykonaj polecenie Transact-SQL w programie Microsoft SQL Server Management Studio (SSMS):

TRUNCATE TABLE TestDatabase.dbo.myNative;  -- for testing
INSERT INTO TestDatabase.dbo.myNative
    SELECT *
    FROM OPENROWSET (
        BULK 'D:\BCP\myNative.bcp', 
        FORMATFILE = 'D:\BCP\myNative.fmt'  
        ) AS t1;

-- review results
SELECT * FROM TestDatabase.dbo.myNative;

Aby używać formatów danych do importowania zbiorczego lub eksportu zbiorczego: