在SQL Server Management Studio中,我想知道什么是SQLCMD模式?
在SQL Server Management Studio中,我想知道什么是SQLCMD模式?
我进行了更深入的研究,下面是我对此的理解,以扩展迄今为止所写的内容:
SQLCMD.exe是SQL Server 2005及更高版本安装包中包含的控制台实用程序。通常可以在类似于c:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE
的路径下找到它。
它是一个简单的脚本环境,允许自动化与SQL服务器相关的任务。例如,您可以编写并执行一个脚本,将登录到特定的SQL Server实例,从给定目录上的此连接执行脚本,并将输出存储在指定的文件中。
Invoke-Sqlcmd
命令提供了一种标准化、基于Powershell的方法来替换这个工具,并保留大部分原始语法和功能,该命令在SQL Server 2008中被引入。
在SSMS中,SQLCMD模式是一种脚本执行模式,模拟了sqlcmd.exe环境,因此接受一些不属于T-SQL语言的命令。
与sqlcmd.exe
不同,它使用SqlClient(与SSMS相同的方式)而不是ODBC数据提供程序来联系数据库,因此在某些方面它可能会有不同的行为。
在SQLCMD模式下执行脚本允许使用典型的sqlcmd.exe
环境命令。但是,SQLCMD模式没有IntelliSense或调试支持,因此维护混合了清洁的T-SQL和SQLCMD特定代码的脚本可能会很麻烦。因此,只有在必要时才应使用它。
假设一个公司对包含环境名称的数据库具有命名约定,例如:MyDb_Prod、MyDb_Test、MyDb_Dev。这个约定可能被用来最小化错误的机会。
当开发人员编写T-SQL脚本时,它将在部署/测试过程中在不同的环境中执行,这将需要许多代码版本:
SELECT *
FROM [MyDb_Dev].[dbo].[MyTable1] -- MyDb_Dev -> MyDb_Test -> MyDb_Prod
相反,我们可以假设数据库名称将在部署过程中作为SQLCMD变量提供,并且完全相同的文件将部署到所有环境中:
-- :setvar databaseName "MyDb_Dev" -- uncomment for testing in SSMS
SELECT *
FROM [$(databaseName)].[dbo].[MyTable1]
(在这个简单的例子中可以完全省略数据库名称,但如果您有跨数据库联接,则使用数据库名称是必要的)
这就是它的字面意思。
这是一种可以让你撰写SQLCMD脚本的模式。
来自MSDN - 使用查询编辑器编辑SQLCMD脚本:
要使用数据库引擎查询编辑器编写或编辑SQLCMD脚本,必须启用SQLCMD脚本模式。
在SQL Server Management Studio中,通过“查询”菜单(查询->SQLCMD模式)设置此选项。
"当您需要在同一个脚本中处理Windows系统命令和Transact-SQL语句时,可以使用SQLCMD脚本。"
"默认情况下,在查询编辑器中未启用SQLCMD模式。您可以通过单击工具栏中的SQLCMD模式图标或从查询菜单中选择SQLCMD模式来启用脚本模式。"
参考:MSDN
由于编辑器处于SQLCMD模式,因此此编辑器未激活Transact-SQL IntelliSense。
我正在使用Visual Studio将SQL Server项目发布到数据库以同步更改,但出现了上述错误。发布失败了。我关闭了VS中的所有打开文件,问题得到解决。
我希望通过现实生活的例子来解释为什么人们使用SQLCMD模式。