What support does Liquibase have for native executors with Microsoft SQL Server?
Last updated: July 14, 2025
SQLCMD integration arguments
Note: Syntax for each parameter is specified in kebab-case
(CLI and flow file), camelCase
(properties file and JAVA_OPTS
), and MACRO_CASE
(environment variable).
Syntax ( | Type | Description |
--sqlcmd-args liquibase.sqlcmd.args LIQUIBASE_SQLCMD_ARGS | String | Defines extra arguments to pass to the Note: The delimiter for arguments is a space |
--sqlcmd-catalog-name liquibase.sqlcmd.catalogName LIQUIBASE_SQLCMD_CATALOG_NAME | String | Database to use when running SQLCMD. |
--sqlcmd-keep-temp liquibase.sqlcmd.keep.temp LIQUIBASE_SQLCMD_KEEP_TEMP | Boolean | Indicates whether or not to keep a temporary SQL file after the execution of SQLCMD. If |
--sqlcmd-keep-temp-name liquibase.sqlcmd.keep.temp.name LIQUIBASE_SQLCMD_KEEP_TEMP_NAME | String | Indicates the name of a temporary SQL file after the execution of SQLCMD. If no file name is specified, a name is automatically generated. |
--sqlcmd-keep-temp-overwrite liquibase.sqlcmd.keep.temp.overwrite LIQUIBASE_SQLCMD_KEEP_TEMP_OVERWRITE | Boolean | Overwrites any files in the specified directory with the same name. Default: |
--sqlcmd-keep-temp-path liquibase.sqlcmd.keep.temp.path LIQUIBASE_SQLCMD_KEEP_TEMP_PATH | String | Specify the path in which to store the temporary files after the execution of SQLCMD. If not specified, the files will be stored in the system's |
--sqlcmd-log-file liquibase.sqlcmd.logFile LIQUIBASE_SQLCMD_LOG_FILE | String | Log file for SQLCMDoutput. |
--sqlcmd-path liquibase.sqlcmd.path LIQUIBASE_SQLCMD_PATH | String | Path to Linux:
Windows:
|
--sqlcmd-timeout liquibase.sqlcmd.timeout LIQUIBASE_SQLCMD_TIMEOUT | Integer | Indicates seconds to wait for the |
Formatted SQL changeset using the runWith
attribute
--liquibase formatted sql
--changeset myauthorname:2314 runWith:sqlcmd
DECLARE l_emp_name VARCHAR2(250);
l_emp_no NUMBER;
l_salary NUMBER;
l_manager VARCHAR2(250);
BEGIN
INSERT INTO emp(emp_name,emp_no,salary,manager) VALUES('BBB',1000,25000,'AAA');
...
END;
/
XML changelog with the inline SQL changeset using the runWith
attribute
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd
http://www.liquibase.org/xml/ns/pro
http://www.liquibase.org/xml/ns/pro/liquibase-pro-latest.xsd">
<changeSet id="2" author="myauthorname" runWith="sqlcmd">
<sql>
DECLARE l_emp_name VARCHAR2(250);
l_emp_no NUMBER;
l_salary NUMBER;
l_manager VARCHAR2(250);
BEGIN
INSERT INTO emp(emp_name,emp_no,salary,manager) VALUES('BBB',1000,25000,'AAA');
...
END;
/
</sql>
</changeSet>
XML changelog pointing to an SQL file with raw SQL in it
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd
http://www.liquibase.org/xml/ns/pro
http://www.liquibase.org/xml/ns/pro/liquibase-pro-latest.xsd">
<changeSet id="2315" author="myauthorname" runWith="sqlcmd">
<sqlFile
path="my/path/file.sql"
... >
</changeSet>
YAML changelog pointing to an SQL file with raw SQL in it
databaseChangeLog:
- changeSet: null
id: 1-yaml
author: myauthorname
runWith: sqlcmd
changes:
- sqlFile: null
path: person.sql
relativeToChangelogFile: true
JSON changelog pointing to an SQL file with raw SQL in it
Best practices
Do not set the
endDelimiter
orsplitStatements=true
property on SQLCMD changesets. SQLCMD handles delimiters and statement splitting natively.Prevent hanging queries by configuring the timeout. In your
liquibase.sqlcmd.config
file, addliquibase.sqlcmd.timeout=nn
, wherenn
is the number of seconds to wait before stopping the process.Save the output of your spool files to your temp directory by adding
liquibase.sqlcmd.keep.temp=true
to theliquibase.sqlcmd.conf
file.
Example liquibase.sqlcmd.conf file
####
## Note about relative and absolute paths:
## The liquibase.sqlcmd.path must be a valid path to the SQLCMD executable.
## The liquibase.sqlcmd.timeout value can be one of:
## -1 - disable the timeout
## Any integer value > 0 (measured in seconds)
##
####
# The full path to the SQLCMD executable.
# Sample Linux path
# liquibase.sqlcmd.path=/opt/mssql-tools/bin/sqlcmd
# Sample Windows path
# liquibase.sqlcmd.path="C:\\Program Files\\Microsoft SQL Server\\Client SDK\\ODBC\\170\\Tools\\Binn\\SQLCMD.EXE"
# A valid timeout value for the execution of the SQLCMD tool
liquibase.sqlcmd.timeout=-1
# Flag to indicate whether or not to keep the temporary SQL file after execution of SQLCMD.
# True = keep False = delete (default)
liquibase.sqlcmd.keep.temp=true
# OPTIONAL Flag to designate the location to store temporary SQL file after execution of SQLCMD.
# Liquibase will attempt to use path exactly as entered, so please ensure it complies with your OS requirements.
# liquibase.sqlcmd.keep.temp.path=
# OPTIONAL Flag to designate the name of temporary SQL file after execution of SQLCMD.
# Liquibase will attempt to use the name exactly as entered, so please ensure it complies with your OS requirements.
# liquibase.sqlcmd.keep.temp.name=
# OPTIONAL Args to pass directly to SQLCMD.
# Learn about SQLCMD args at https://<link>
# Note: The delimiter for args is a space eg:" " and not "," or ";" separated.
# liquibase.sqlcmd.args=
# OPTIONAL Path to a log file for the SQLCMD output
# liquibase.sqlcmd.logFile=