SSMS 中的 SQLCMD 模式和@@variable 扩展

bil*_*nkc 8 sql-server-2005 sql-server-2008 sql-server

在 SSMS 中使用 SQLCMD 模式时(不是从命令行),有没有办法将当前服务器和实例分配给变量?这不同于分配普通的 TSQL 变量。

问题定义

我想使用 SQLCMD 变量扩展的强大功能来替换部署脚本中特定于环境的值,而不是我已经进入的现有 tsql 字符串构建混搭。除了当前环境的一个例外,使用 SQLCMD 处理部署的进展非常顺利。

--
-- define 2 sqlcmd variables that will be expanded in scripts
--
:setvar dbServer "DEVA2\DEV2"
:setvar dbNotServer @@servername

SELECT
    '$(dbServer)' AS hard_coded_value
,   @@servername AS [servername]
,   '$(dbNotServer)' AS dbNotServer
Run Code Online (Sandbox Code Playgroud)

这会产生以下结果。

hard_coded_value  servername  dbNotServer
DEVA2\DEV2        DEVA2\DEV2  @@servername
Run Code Online (Sandbox Code Playgroud)

肉饼说3分之2 还不错,但我宁愿有 3 分之 3 的解决方案。当该脚本部署到测试服务器时,我不想相信部署人员会编辑脚本。

如果使用 SQLCMD 的唯一解决方案是完全从命令行调用脚本,我可以接受这一点,但我想把它扔在这里,因为我对使用 SQLCMD 不感兴趣。

期望输出

:setvar dbNotServer @@servername
SELECT '$(dbNotServer)' AS worked
Run Code Online (Sandbox Code Playgroud)

结果

worked
DEVA\DEV2
Run Code Online (Sandbox Code Playgroud)

徒劳的追求

第一个 BOL 链接显示出承诺,我所要做的就是使用 SQLCMDSERVER 但无济于事。在 SQLCMD 模式下在 SSMS 的上下文中运行,它会抛出一个致命的脚本错误

-- A fatal scripting error occurred.
-- Variable SQLCMDSERVER is not defined.
SELECT '$(SQLCMDSERVER)' AS [FatalScriptingError]
Run Code Online (Sandbox Code Playgroud)

风滚草更新

2011-08-12 为了将我的问题简化为最简单的形式,基于答案,我过度简化了我的查询(我的道歉)。我使用的查询的一部分如下。这两个回复者在他们的答案中是正确的,即标识在刻度线中包装 @@servername 导致文字值并获得扩展值,我需要从引号中解开它。我的愿望是使用 sqlcmd 变量替换而不是解包需要的字符串构建。

INSERT INTO
    dbo.SSISCONFIG
(
    ConfigurationFilter
,   ConfiguredValue
,   PackagePath
,   ConfiguredValueType
,   Application
,   Category
,   Subcategory
,   Comment
)
SELECT
    'Default.Accounting' AS ConfigurationFilter
,   'Data Source=$(dbServer);Initial Catalog=Accounting;Provider=SQLNCLI10.1;Integrated Security=SSPI;Packet Size=32767;' AS ConfiguredValue
,   '\Package.Connections[Accounting].Properties[ConnectionString]' AS PackagePath
,   'String' AS ConfiguredValueType
,   'Defaults' AS Application
,   'Connection' AS Category
,   'Database' AS Subcategory
,   'Default connection string' AS Comment
SELECT
    'Default.$(sqlVersion).CorporateReporting' AS ConfigurationFilter
,   'Data Source=$(dwServer);Initial Catalog=CRDS;Provider=SQLNCLI10.1;Integrated Security=SSPI;Packet Size=32767;' AS ConfiguredValue
,   '\Package.Connections[CorporateReporting].Properties[ConnectionString]' AS PackagePath
,   'String' AS ConfiguredValueType
,   'Defaults' AS Application
,   'Connection' AS Category
,   'Database' AS Subcategory
,   'Default connection string' AS Comment
Run Code Online (Sandbox Code Playgroud)

命令行调用有效(如预期)

C:\>sqlcmd -E -d master -S DEVA2\DEV2 -Q "SELECT '$(SQLCMDSERVER)' AS [servername]"
Run Code Online (Sandbox Code Playgroud)

我已经尝试并丢弃了 :setvar x @@servername 的其他排列,试图将数据库变量的评估值存储到 SQLCMD 变量中。在这一点上,我相当确定 sqlcmd 变量在查询编译之前被替换在查询中,但很想被证明是错误的。

提单参考

Sql*_*CID 3

除非我遗漏了一些东西,否则如果没有撇号,这不起作用吗?:

:setvar dbNotServer @@servername
SELECT $(dbNotServer) AS worked
Run Code Online (Sandbox Code Playgroud)

它通过 SSMS 在 SQLCMD 模式下为我返回 SERVER\INSTANCE。

编辑 02/12/2018 在看到我对另一个问题的回答并进行审查后,我可以看到这个问题,我相信它可以归结为:

:setvar dbNotServer @@servername
print '$(dbNotServer)'
Run Code Online (Sandbox Code Playgroud)

这会输出@@servername,所需的输出是 @@servername 的值。我见过的唯一方法是在此处接受的答案中