【发布时间】:2012-02-01 14:06:36
【问题描述】:
在 SQL Server Management Studio 中我想知道什么是 SQLCMD 模式?
【问题讨论】:
-
请参阅The SQLCMD workbench 了解一些有用的示例。
标签: sql-server ssms
在 SQL Server Management Studio 中我想知道什么是 SQLCMD 模式?
【问题讨论】:
标签: sql-server ssms
我做了一些更多的研究,所以这是我对此的理解,以扩展迄今为止所写的内容:
SQLCMD.exe 是一个控制台实用程序,包含在 SQL Server 2005 及更高版本的安装中。您通常可以在c:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE 之类的路径中找到它。
这是一个简单的脚本环境,允许自动执行与 SQL 服务器相关的任务。例如,您可以编写并执行一个脚本,该脚本将登录到特定的 SQL Server 实例,从该连接上的给定目录执行脚本,并将输出存储在指定的文件中。
Invoke-Sqlcmd cmdlet 是随 SQL Server 2008 一起引入的,目的是用基于 Powershell 的标准化方法替换此工具,同时保留大部分原始语法和功能。
在 SSMS 中,SQLCMD 模式 是一种脚本执行模式,它模拟 sqlcmd.exe 环境,因此接受一些不属于 T-SQL 语言的命令。
与 sqlcmd.exe 不同,它使用 SqlClient(与 SSMS 相同的方式)而不是 ODBC 数据提供程序来联系数据库,因此在某些方面它可能具有与 @987654327 不同的行为@。
在 SQLCMD 模式下执行脚本允许使用典型的 sqlcmd.exe 环境命令。但是,SQLCMD 模式没有 IntelliSense 或调试支持,因此维护将干净的 T-SQL 与 SQLCMD 特定代码混合的脚本可能会很痛苦。因此,它应该只在必要时使用。
假设一家公司对名称中包含环境的数据库有一个命名约定,例如:MyDb_Prod、MyDb_Test强>,MyDb_Dev。此约定可能用于minimize chance of mistakes。
开发者在编写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 - Editing SQLCMD Scripts with Query Editor:
要使用数据库引擎查询编辑器编写或编辑 SQLCMD 脚本,您必须启用 SQLCMD 脚本模式。
在 SQL Server Management Studio 中,通过查询菜单(查询 -> SQLCMD 模式)进行设置。
【讨论】:
“当您必须在同一个脚本中处理 Windows 系统命令和 Transact-SQL 语句时,您可以使用 SQLCMD 脚本。”
“默认情况下,查询编辑器中未启用 SQLCMD 模式。您可以通过单击工具栏中的 SQLCMD 模式图标或从查询菜单中选择 SQLCMD 模式来启用脚本模式。”
参考:MSDN
【讨论】:
消息 Transact-SQL IntelliSense 对该编辑器无效,因为该编辑器处于 SQLCMD 模式。
我正在将 SQL Server 项目从 Visual Studio 发布到数据库以同步更改并收到上述错误。发布失败。 我关闭了 VS 中所有打开的文件,它解决了这个问题。
我希望现实生活中的例子能解释为什么人们使用 SQLCMD 模式。
【讨论】: