To use the Bulk Copy Program (BCP) on SQL Server 2022 running on Azure Virtual Machines (VMs), follow these steps. BCP is a powerful command-line utility that allows fast import and export of data between a SQL Server table and a data file.
β Overview
BCP is ideal for:
Importing large volumes of data into SQL Server from flat files (CSV, TXT).
Exporting data from SQL Server to file formats for backup, transfer, or reporting.
When using SQL Server 2022 on Azure VMs, BCP works the same as it does on-premises, but with extra considerations for:
Network security
Storage locations (e.g., local disk or mounted Azure File Share)
π§± Prerequisites
Install BCP Utility (if not already available):
Included with SQL Server tools or MS Command Line Utilities.
Verify with:
bcp -v
Ensure the SQL Server is Accessible:
On your Azure VM, SQL Server must be listening on TCP port 1433.
Add an inbound NSG rule to allow traffic (if testing externally).
Authentication:
Use SQL authentication (-U and -P) or Windows authentication (-T if the VM is domain-joined).
Permissions:
Ensure the SQL login has BULK INSERT and table-level INSERT or SELECT permissions.
π₯ Import Example (Data File β SQL Table)
bcp YourDatabase.dbo.YourTable in "C:\data\importfile.csv" ^
-S localhost -U sa -P YourPassword ^
-c -t, -r\n
Flags Explained:
YourDatabase.dbo.YourTable: Full name of the target table.
in: Direction is import.
-S: SQL Server instance (use localhost or public IP).
-U / -P: SQL login credentials.
-c: Character data type (default format).
-t,: Field terminator is a comma (CSV).
-r\n: Row terminator is newline.
π€ Export Example (SQL Table β Data File)
bcp YourDatabase.dbo.YourTable out "C:\data\exportfile.csv" ^
-S localhost -U sa -P YourPassword ^
-c -t, -r\n
This will export the tableβs data into a CSV file.*
π Security Tip for Azure VMs
Avoid exposing your SQL Server to the public internet.
If you must connect remotely, use Azure Bastion, VPN, or Just-in-Time VM access.
Always encrypt your BCP file if it contains sensitive data.
π‘ Advanced Use
* Export using a query:
bcp "SELECT * FROM YourDatabase.dbo.YourTable WHERE status = 'active'" queryout "C:\data\filtered.csv" ^
-S localhost -U sa -P YourPassword ^
-c -t, -r\n
* Use format files for complex schemas:
bcp YourDatabase.dbo.YourTable in "C:\data\importfile.csv" -f "C:\data\formatfile.fmt" ^
-S localhost -U sa -P YourPassword
"Azure CLI example" to automate the Bulk Copy Process
Here's a complete Azure CLI script to automate the BCP (Bulk Copy Program) import process into SQL Server 2022 running on an Azure VM. This script includes:
Connecting to the Azure VM
Uploading a CSV file to the VM
Executing the bcp command remotely using a run command
Cleanup steps (optional)
β Azure CLI Script to Automate BCP Import π§ Prerequisites
SQL Server 2022 is installed and listening on localhost on your Azure VM
The VM is running Windows OS
You have a CSV file ready for upload (e.g., customers.csv)
The SQL Server login (e.g., sa) and password are known
Replace the blob URL with your real Azure Blob Storage file path or implement az storage blob upload if you're using azcopy.
CustomScriptExtension assumes you are moving files from Azure Blob to the VM. You can also SCP the file directly if the VM has SSH access.
You can wrap this script inside a GitHub Actions workflow or Azure DevOps pipeline for CI/CD.
π Security Considerations:
* Store passwords in Azure Key Vault and retrieve them using:
SQL_PASSWORD=$(az keyvault secret show --vault-name "MyVault" --name "SqlPassword" --query value -o tsv)
Like the bulk insert statement, the bulk copy program (bcp) can be used to load data from a file into a table.
However, unlike the bulk insert statement, bcp can also be used to extract data from a table. The parameters for the bcp program are similar to the bulk insert statement options. The following MouseOver illustrates the syntax of the bulk copy program.
(BCP) Bulk Copy Program in SQL Server
dbtable The permanent table, global temporary table, or view to access.
query bcp can extract data from a query, the query must be enclosed in double quotes(query).
in | out | queryout | format Specifies what the bcp is being used for.
Datafile The file to export/import; you must specify the datafile.
-m maxerrors The maximum number of errors before the bcp is aborted; this parameter defaults to 10.
-f formatfile Specifies the file that contains information; defaults to no format file.
-e errfile A file that all records that generate errors will be copied to. If you do not specify a error file, SQL Server will print error information to the screen, but will not tell you what row caused the problem; defaults to no errorfiles.
-F firstrow Specifies the first row from the file to load, or the first row from the table to export. Defaults to the first row.
-L lastrow Specifies the last row to load, or the last row to export; defaults to all the rows.
-b batchsize Specifies how many rows to import as one transaction; defaults to all the file
-n Data is stored as SQL Servers native type; defaults to not being set.
-c Data is stored as character; defaults to not being set.
-w Data is unicode character; defaults to not being set.
-N Non-text data is native format; defaults to not being set.
-q Quoted identifier specifies that the dbtable string will either contain quotes or brackets to delimit object names; defaults tonot being set.
-C code page Specifies the code page that is used to store character data; defaults to SQL Servers standard code page
-t field terminator Specifies the field terminator; default is a tab (\t)
-r row terminator Specifies the row terminator; default is a newline (\n)
-i inputfile Allows you to specify a file that contains the answers to questions describing the format of the bcp; defaults to noinput file.
-o outfile Allows you to specify a file in which bcp will store its output; defaults to no output file
-a packetsize Allows you to specify how many bytes will be sent between SQL Server and bcp in a newtwork packet; defaults to SQL Servers configured value.
-S server name The SQL Server to connect with; defaults to the local server.
-U username The SQL Server standard security account to use when connecting to SQL Server; defaults to your Windows Login name.
-P password The password to use when connecting to SQL Server. If a password is not provided, bcp will prompt you for one; there is no default.
-T bcp will connect using a trusted connection, using integrated security; defaults to not being set.
-v bcp will display its version; defaults to not being set.
-R The client settings for date, time, and currency formats will be used; defaults to not being set.
-k SQL will not apply default values for columns that are not loaded as part of the bcp operation; defaults to not being set.
-E SQL will not generate new identity values for tables containing identity types; defaults to not being set.
-h "load hints" Allows you to control the behavior of bcp by specifying one of the following CHECK_CONSTRAINTS, KILLOBYTES_PER_BATCH, ORDER, ROWS_PER_BATCH, or TABLOCK. These all behave the same as the BULK INSERT statements options.
bulk-copy consisting of dbtable, query, in | out | queryout | format
When performing bulk copies, you should first know the following information:
When using a query, you can specify any valid SQL statement.
If you are using a query and it produces multiple result sets (either from calling a stored procedure, or having a compute by[1] clause), the bcp will only extract the first result set.
If a data file is missing, the first parameter after the direction ( IN, OUT, FORMAT, QUERYOUT) is treated as the data file name.
The E parameter has no effect if the file does not contain data for the identity column.
If n, -c, -w, -6 , -N or f are not specified, bcp will prompt you for format information about each column.
If one of n, -c, -w, -6 , -N or f is specified, a \r will be used as the row terminator and a \t will be used as a field terminator.
In = Import data; out = export data; queryout = you are using a query to export data; format = generate a format file without extracting data--this must be used with the f option.
Example
bcp Sales.employee in empl.data
-S WesternRegion –T -c
The example above loads data from the file empl.data into the Sales database.
The employee table is on the WesternRegion database server and uses integrated security.
This file has data stored in character format, with a tab between fields and a carriage return at the end of each record.
While bcp allows you to transfer data between SQL Server and files, often times you will want to move data between other data sources. The next
lesson will introduce you to the basics of the data transformation services.
[1]Compute by: A TSQL extension that allows you to have summary rows intermixed with detail rows.