Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Applies to:
SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
By default, when data is imported into a table, the bcp command and BULK INSERT statement observe any defaults that are defined for the columns in the table. For example, if there is a null field in a data file, the default value for the column is loaded instead. The bcp command and BULK INSERT statement both allow you to specify that nulls values be retained.
In contrast, a regular INSERT
statement retains the null value instead of inserting a default value. The INSERT ... SELECT * FROM OPENROWSET BULK statement provides the same basic behavior as regular INSERT but additionally supports a table hint for inserting the default values.
Keep null values
The following qualifiers specify that an empty field in the data file retains its null value during the bulk-import operation, rather than inheriting a default value (if any) for the table columns. For OPENROWSET BULK, by default, any columns that are not specified in the bulk-load operation are set to NULL
.
Command | Qualifier | Qualifier type |
---|---|---|
bcp |
-k |
Switch |
BULK INSERT |
KEEPNULLS * |
Argument |
INSERT ... SELECT * FROM OPENROWSET(BULK...) |
N/A | N/A |
* For BULK INSERT (Transact-SQL), if default values are not available, the table column must be defined to allow null values.
Note
These qualifiers disable checking of DEFAULT
definitions on a table by these bulk-import commands. However, for any concurrent INSERT
statements, DEFAULT
definitions are expected.
Use Default Values with INSERT ... SELECT * FROM OPENROWSET BULK
You can specify that for an empty field in the data file, the corresponding table column uses its default value (if any). To use default values, use table hints.
For more information, see OPENROWSET BULK.
Example test conditions
The examples use the database and format files created in this article.
Change the local file location of the code sample to a file location on your machine.
Sample Table
The script creates a test database and a table named myNulls
. The fourth table column, Kids
, has a default value. Execute the following Transact-SQL in Microsoft SQL Server Management Studio (SSMS):
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
);
Sample data file
Using Notepad, create an empty file D:\BCP\myNulls.bcp
and insert the following sample data. There is no value in the third record, fourth column.
1,Anthony,Grosse,Yes,1980-02-23
2,Alica,Fatnowna,No,1963-11-14
3,Stella,Rosenhain,,1992-03-02
Alternatively, you can execute the following PowerShell script to create and populate the data file:
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;
Sample non-XML format file
SQL Server support two types of format file: non-XML format and XML format. The non-XML format is the original format that is supported by earlier versions of SQL Server. For more information, see Use Non-XML format files (SQL Server).
The following command will use the bcp utility to generate a non-XML format file, myNulls.fmt
, based on the schema of myNulls
.
- To use a bcp command to create a format file, specify the
format
argument and usenul
instead of a data-file path. - The format option also requires the
-f
option. c
is used to specify character datat,
is used to specify a comma as a field terminatorT
is used to specify a trusted connection using integrated security.
At a command prompt, enter the following command:
bcp TestDatabase.dbo.myNulls format nul -c -f D:\BCP\myNulls.fmt -t, -T
REM Review file
Notepad D:\BCP\myNulls.fmt
Important
Ensure your non-XML format file ends with a carriage return\line feed. Otherwise you will likely receive the following error message:
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]I/O error while reading BCP format file
For more information about creating format files, see Create a format file with bcp (SQL Server).
Keep nulls or use default values during bulk import
The examples use the database, datafile, and format files created in this article.
Use bcp and keep null values without a format file
The -k
switch.
At a command prompt, enter the following command:
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;"
Use bcp and keep null values with a non-XML format file
The -k
and -f
switches.
At a command prompt, enter the following command:
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;"
Use bcp and default values without a format file
At a command prompt, enter the following command:
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;"
Use bcp and default values with a non-XML format file
The -f
switch.
At a command prompt, enter the following command:
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;"
Use BULK INSERT and keep null values without a format file
The KEEPNULLS
argument.
Execute the following Transact-SQL in Microsoft SQL Server Management Studio (SSMS):
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;
Use BULK INSERT and keep null values with a non-XML format file
The KEEPNULLS
and the FORMATFILE
argument.
Execute the following Transact-SQL in Microsoft SQL Server Management Studio (SSMS):
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;
Use BULK INSERT and use default values without a format file
Execute the following Transact-SQL in Microsoft SQL Server Management Studio (SSMS):
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;
Use BULK INSERT and default values with a non-XML format file
The FORMATFILE
argument.
Execute the following Transact-SQL in Microsoft SQL Server Management Studio (SSMS):
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;
Use OPENROWSET BULK and keep null values with a non-XML format file
The FORMATFILE
argument.
Execute the following Transact-SQL in Microsoft SQL Server Management Studio (SSMS):
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;
Use OPENROWSET BULK and keep default values with a non-XML format file
The KEEPDEFAULTS
table hint and FORMATFILE
argument.
Execute the following Transact-SQL in Microsoft SQL Server Management Studio (SSMS):
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;
Related Tasks
To use a format file
To use data formats for bulk import or bulk export
Import native and character format data from earlier versions of SQL Server
Use unicode character format to import or export data (SQL Server)
Use Unicode Native Format to Import or Export Data (SQL Server)
To specify data formats for compatibility when using bcp