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 remove sqlcmd 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 both sqlcmd 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 asqlcmd` command and convert it to a comment before returning it.
DbUp's SQL Server support should allow the processing of .sql scripts that make use of
sqlcmdutility commands and scripting variables.sqlcmdScripting Variablessqlcmdscripting variables are referenced using$(variableName). This is only slightly different than a DbUp variable reference which uses$variableName$. In order for DbUp to properly handlesqlcmdscripting variable references, two DbUp classes must be changed.DbUp.Engine.Preprocessors.StripSchemaPreprocessor.csThis 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 removesqlcmdreferences, 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 both
sqlcmdand 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$, andsqlcmd-style variable references, e.g.,$(variableName)should be supported.sqlcmdCommandssqlcmdsupports a number of commands. These commands are processed bysqlcmdbefore the Transact-SQL script is submitted to the SQL Server engine for processing.These
sqlcmdcommands 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 theosqlcommand-line utility. However, in the real world,sqlcmdcommands almost always begin with a colon character, e.g.,:setvaror:r.DbUp should not attempt to support the functionality of the
sqlcmdcommands. Rather, DbUp should convert everysqlcmdcommand to a double-dash comment and return it as part of the content of the script to be processed by SQL Server. So, the followingsqlcmdcommandsbecomes the following.
This requires the following changes.
This class reads individual Transact-SQL commands out of a script file. When parsing the script text, this class must recognize asqlcmd` command and convert it to a comment before returning it.