Beibehalten von NULL-Werten oder Standardwerten während des Massenimports (SQL Server)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Wenn Daten in eine Tabelle importiert werden, beobachten der bcp-Befehl und BULK INSERT die Anweisung standardmäßig alle Standardwerte, die für die Spalten in der Tabelle definiert sind. Wenn beispielsweise ein NULL-Feld in einem Datenfeld vorkommt, wird stattdessen der Standardwert für die Spalte geladen. Sowohl der bcp-Befehl als auch die BULK INSERT Anweisung erlauben es Ihnen, anzugeben, dass NULL-Werte beibehalten werden.

Im Gegensatz dazu behält eine reguläre INSERT Anweisung den NULL-Wert bei, anstatt einen Standardwert einzufügen. Die INSERT ... SELECT * FROM OPENROWSET BULK-Anweisung bietet das gleiche grundlegende Verhalten wie normal INSERT , unterstützt aber zusätzlich einen Tabellenhinweis zum Einfügen der Standardwerte.

Nullwerte beibehalten

Die folgenden Qualifizierer geben an, dass ein leeres Feld in der Datendatei seinen NULL-Wert während des Massenimportvorgangs beibehält, statt (ggf.) einen Standardwert für die Tabellenspalten zu übernehmen. Für OPENROWSET BULK werden standardmäßig alle Spalten, die im Massenladevorgang nicht spezifiziert werden, auf NULL festgelegt.

Befehl Qualifizierer Qualifizierertyp
bcp -k Schalter
BULK INSERT KEEPNULLS* Streitpunkt
INSERT ... SELECT * FROM OPENROWSET(BULK...)

* Für BULK INSERT (Transact-SQL), wenn Standardwerte nicht verfügbar sind, muss die Tabellenspalte definiert werden, um Nullwerte zuzulassen.

Hinweis

Diese Qualifier deaktivieren die Überprüfung von DEFAULT Definitionen in einer Tabelle durch diese bulk-import Befehle. Für alle parallelen INSERT Anweisungen werden jedoch DEFAULT Definitionen erwartet.

Mit INSERT Standardwerte verwenden ... SELECT * FROM OPENROWSET BULK

Sie können angeben, dass die entsprechende Tabellenspalte für ein leeres Feld in der Datendatei den Standardwert verwendet (falls vorhanden). Um Standardwerte zu verwenden, verwenden Sie Tabellenhinweise.

Weitere Informationen finden Sie unter OPENROWSET BULK.

Beispieltestbedingungen

In den Beispielen werden die in diesem Artikel erstellten Datenbank- und Formatdateien verwendet.

Ändern Sie den lokalen Dateispeicherort des Codebeispiels in einen Dateispeicherort auf Ihrem Computer.

Beispieltabelle

Das Skript erstellt eine Testdatenbank und eine Tabelle mit dem Namen myNulls. Die vierte Tabellenspalte weist Kidseinen Standardwert auf. Führen Sie die folgenden Transact-SQL-Anweisungen in Microsoft SQL Server Management Studio (SSMS) aus:

CREATE DATABASE TestDatabase;
GO

USE TestDatabase;
CREATE TABLE dbo.myNulls ( 
   PersonID smallint not null,
   FirstName varchar(25),
   LastName varchar(30),
   Kids varchar(13) DEFAULT 'Default Value',
   BirthDate date
   );

Beispieldatendatei

Erstellen Sie mit Notepad eine leere Datei D:\BCP\myNulls.bcp, und fügen Sie die folgenden Beispieldaten ein. Der dritte Datensatz, die vierte Spalte, enthält keinen Wert.

1,Anthony,Grosse,Yes,1980-02-23
2,Alica,Fatnowna,No,1963-11-14
3,Stella,Rosenhain,,1992-03-02

Alternativ können Sie das folgende PowerShell-Skript ausführen, um die Datei zu erstellen und aufzufüllen:

cls
# revise directory as desired
$dir = 'D:\BCP\';

$bcpFile = $dir + 'MyNulls.bcp';

# Confirm directory exists
IF ((Test-Path -Path $dir) -eq 0)
{
    Write-Host "The path $dir does not exist; please create or modify the directory.";
    RETURN;
};

# clear content, will error if file does not exist, can be ignored
Clear-Content -Path $bcpFile -ErrorAction SilentlyContinue;

# Add data
Add-Content -Path $bcpFile -Value '1,Anthony,Grosse,Yes,1980-02-23';
Add-Content -Path $bcpFile -Value '2,Alica,Fatnowna,No,1963-11-14';
Add-Content -Path $bcpFile -Value '3,Stella,Rosenhain,,1992-03-02';

#Review content
Get-Content -Path $bcpFile;
Invoke-Item $bcpFile;

Beispieldatei im Nicht-XML-Format

SQL Server unterstützt zwei Typen von Formatdateien: Nicht-XML- und XML-Format. Nicht-XML ist das ursprüngliche Format, das von früheren Versionen von SQL Server unterstützt wird. Weitere Informationen finden Sie unter Verwenden von Nicht-XML-Formatdateien (SQL Server).

Der folgende Befehl verwendet das bcp-Hilfsprogramm , um eine Nicht-XML-Formatdatei zu generieren, myNulls.fmtbasierend auf dem Schema von myNulls.

  • Wenn Sie einen bcp-Befehl zum Erstellen einer Formatdatei verwenden möchten, geben Sie das format Argument an, und verwenden Sie nul das Argument anstelle eines Datendateipfads.
  • Die Formatoption erfordert auch die -f Option.
  • c wird verwendet, um Zeichendaten anzugeben.
  • t,wird verwendet, um ein Komma als Feldterminator anzugeben.
  • T wird verwendet, um eine vertrauenswürdige Verbindung mit integrierter Sicherheit anzugeben.

Geben Sie folgenden Befehl an der Eingabeaufforderung ein:

bcp TestDatabase.dbo.myNulls format nul -c -f D:\BCP\myNulls.fmt -t, -T

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

Wichtig

Stellen Sie sicher, dass Ihre Datei im Nicht-XML-Format mit einem Wagenrücklauf/Zeilenvorschub endet. Andernfalls wird Ihnen möglicherweise die folgende Fehlermeldung angezeigt:

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

Weitere Informationen zum Erstellen von Formatdateien finden Sie unter Erstellen einer Formatdatei mit bcp (SQL Server).

Beibehalten von Nullen oder Verwenden von Standardwerten während des Massenimports

In den Beispielen werden die in diesem Artikel erstellten Datenbank-, Datendatei- und Formatdateien verwendet.

Verwenden von bcp und Beibehalten von NULL-Werten ohne Formatdatei

Der -k Schalter.

Geben Sie folgenden Befehl an der Eingabeaufforderung ein:

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

REM Import data
bcp TestDatabase.dbo.myNulls IN D:\BCP\myNulls.bcp -c -t, -T -k

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

Verwenden von bcp und Beibehalten von NULL-Werten mit einer Nicht-XML-Formatdatei

Die Schalter -k und -f.

Geben Sie folgenden Befehl an der Eingabeaufforderung ein:

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

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

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

bcp und Standardwerte ohne Formatdatei verwenden

Geben Sie folgenden Befehl an der Eingabeaufforderung ein:

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

REM Import data
bcp TestDatabase.dbo.myNulls IN D:\BCP\myNulls.bcp -c -t, -T

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

Verwenden Sie bcp und Standardwerte mit einer Datei im Nicht-XML-Format

Der -f Schalter.

Geben Sie folgenden Befehl an der Eingabeaufforderung ein:

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

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

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

BULK INSERT verwenden und NULL-Werte ohne Formatdatei beibehalten

Das KEEPNULLS Argument.

Führen Sie die folgenden Transact-SQL-Anweisungen in Microsoft SQL Server Management Studio (SSMS) aus:

USE TestDatabase;
GO
TRUNCATE TABLE dbo.myNulls; -- for testing
BULK INSERT dbo.myNulls
    FROM 'D:\BCP\myNulls.bcp'
    WITH (
        DATAFILETYPE = 'char',  
        FIELDTERMINATOR = ',',  
        KEEPNULLS
        );

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

Verwenden Sie BULK INSERT und behalten Sie Nullwerte in einer Nicht-XML-Formatdatei bei

Das KEEPNULLS Argument und das FORMATFILE Argument.

Führen Sie die folgenden Transact-SQL-Anweisungen in Microsoft SQL Server Management Studio (SSMS) aus:

USE TestDatabase;
GO

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

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

Verwenden Sie BULK INSERT und verwenden Sie Standardwerte ohne Formatdatei

Führen Sie die folgenden Transact-SQL-Anweisungen in Microsoft SQL Server Management Studio (SSMS) aus:

USE TestDatabase;
GO

TRUNCATE TABLE dbo.myNulls;  -- for testing
BULK INSERT dbo.myNulls
   FROM 'D:\BCP\myNulls.bcp'
   WITH (
      DATAFILETYPE = 'char',  
      FIELDTERMINATOR = ','
      );

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

Verwenden Sie BULK INSERT und Standardwerte mit einer Formatdatei ohne XML

Das FORMATFILE Argument.

Führen Sie die folgenden Transact-SQL-Anweisungen in Microsoft SQL Server Management Studio (SSMS) aus:

USE TestDatabase;
GO

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

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

Verwenden von OPENROWSET BULK und Beibehalten von NULL-Werten mit einer Nicht-XML-Formatdatei

Das FORMATFILE Argument.

Führen Sie die folgenden Transact-SQL-Anweisungen in Microsoft SQL Server Management Studio (SSMS) aus:

USE TestDatabase;
GO

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

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

Verwenden von OPENROWSET BULK und Beibehalten von Standardwerten mit einer Nicht-XML-Formatdatei

Der KEEPDEFAULTS Tabellenhinweis und das FORMATFILE-Argument.

Führen Sie die folgenden Transact-SQL-Anweisungen in Microsoft SQL Server Management Studio (SSMS) aus:

USE TestDatabase;
GO

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

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

Verwenden einer Formatdatei

So verwenden Sie Datenformate für Massenimport oder Massenexport

So geben Sie Datenformate für die Kompatibilität bei Verwendung von bcp an