Description
DbUp's SQL Server support should allow the processing of .sql scripts that make use of sqlcmd
utility commands and scripting variables.
sqlcmd
Scripting Variables
sqlcmd
scripting variables are referenced using $(variableName)
. This is only slightly different than a DbUp variable reference which uses $variableName$
. In order for DbUp to properly handle sqlcmd
scripting variable references, two DbUp classes must be changed.
DbUp.Engine.Preprocessors.StripSchemaPreprocessor.cs
This class removes references to the "schema" variable when no value is provided by the caller. In addition to removing DbUp references to the variable, e.g.,$schema$.
, it must also removesqlcmd
references, e.g.,$(schema)
.DbUp.Engine.Preprocessors.VariableSubstitutionPreprocessor.cs
.
This class replaces variable references with their values from the variables array passed to the constructor. This class must recognize bothsqlcmd
and DbUp variable references for replacement.
Note that these changes should be non-breaking. That is to say that scripts that use the existing DbUp variables references will still be handled properly. In fact, the use of both DbUp-style variable references, e.g., $variableName$
, and sqlcmd
-style variable references, e.g., $(variableName)
should be supported.
sqlcmd
Commands
sqlcmd
supports a number of commands. These commands are processed by sqlcmd
before the Transact-SQL script is submitted to the SQL Server engine for processing.
These sqlcmd
commands must start in column 1 of the line and should be prefaced with a colon character, ":". Technically, the colon character is optional in order to support backward compatibility with the osql
command-line utility. However, in the real world, sqlcmd
commands almost always begin with a colon character, e.g., :setvar
or :r
.
DbUp should not attempt to support the functionality of the sqlcmd
commands. Rather, DbUp should convert every sqlcmd
command to a double-dash comment and return it as part of the content of the script to be processed by SQL Server. So, the following sqlcmd
commands
:setvar ScriptPath "C:\Scripts\"
:r $(ScriptPath)ScriptFile.sql
becomes the following.
-- :setvar ScriptPath "C:\Scripts\"
-- :r $(ScriptPath)ScriptFile.sql
This requires the following changes.
- DbUp.Support.SqlServer.SqlCommandReader.cs
This class reads individual Transact-SQL commands out of a script file. When parsing the script text, this class must recognize a
sqlcmd` command and convert it to a comment before returning it.
Metadata
Metadata
Assignees
Labels
Type
Projects
Status