想要自动化一些任务而不是为所有事情启动 SSMS,我正在尝试编写一个批处理文件来运行这些语句,当我将它们粘贴到 sqlcmd 提示符时,它们可以完美地工作。他们只需检查镜像状态,暂停镜像,然后再次检查状态。(为了最小化依赖关系并简化从一台服务器到另一台服务器的迁移,我想将所有命令保存在一个文件中。)
select cast(DB_NAME(database_id) as char(30)),
cast(mirroring_state_desc as char(15))
from sys.database_mirroring
where mirroring_state_desc is not null;
go;
ALTER DATABASE db1 SET PARTNER SUSPEND;
ALTER DATABASE db2 SET PARTNER SUSPEND;
go;
select cast(DB_NAME(database_id) as char(30)),
cast(mirroring_state_desc as char(15))
from sys.database_mirroring
where mirroring_state_desc is not null;
go;
所以,我写了这个批处理文件:
SETLOCAL ENABLEDELAYEDEXPANSION
SET @SQLSTRING=select cast(DB_NAME(database_id) as char(30)), ^
cast(mirroring_state_desc as char(15)) ^
from sys.database_mirroring ^
where mirroring_state_desc is not null; ^
go ^
^
ALTER DATABASE MSCRM_CONFIG SET PARTNER SUSPEND; ^
ALTER DATABASE XeroxGHSCRMTest_MSCRM SET PARTNER SUSPEND; ^
go ^
^
select cast(DB_NAME(database_id) as char(30)), ^
cast(mirroring_state_desc as char(15)) ^
from sys.database_mirroring ^
where mirroring_state_desc is not null; ^
go
::
echo.
sqlcmd -S AGABQ0VMCRMDB01\PROD_CRM -E -Q "%@SQLSTRING%"
但是,它在“go”命令中出现语法错误而失败。我试过“去”和“去”;没有运气。
任何使这项工作的提示或指导将不胜感激。
这种方法有几个问题:
直接的问题是您不能继续空行。
go ^
因此,只有单个字符的两行(每行之后)^
导致该行结束而不是继续。它与 . 无关go
。因此,您可以在胡萝卜之前添加一个空格,它将构建完整的字符串。但是,即使您解决了问题 #1,您仍然会留下无效的 SQL,因为
GO
需要单独一行,或者最多可以选择后跟一些空格和一个 INT 值,以重复前一批 (例如GO 12
)。但是,使用 line continuation via^
不会有任何嵌入式返回,因此所有内容都将作为单行提交,这对于其中的GO
命令来说是无效的语法。这使您有两个选择:
如果您提交的 SQL 不需要任何批处理分离,那么只需摆脱命令(摆脱标志
GO
也不会受到伤害,并且也不需要and final ):@
ENABLEDELAYEDEXPANSION
GO
如果您确实需要批处理分离(例如,您有一个
CREATE PROCEDURE
语句或类似的东西),那么您可以在您的 CMD 脚本中创建一个 SQL 文件,单独添加每一行,然后将其用作 SQLCMD 将运行的 SQL 脚本。这允许您嵌入返回以及使用GO
命令:完全摆脱 GO。sqlcmd 仅在交互式提示中或使用 -i 开关从文件中读取时识别它。如果某些语句需要放在单独的批处理中,请使用 EXEC 将它们包装起来。示例:EXEC('CREATE VIEW SomeView')