使用SQL Server Management Studio中的setvar转义空格字符

时间:2010-12-17 12:37:56

标签: sql-server-2008 sqlcmd

首先,我不是DBA,我没有任何(管理员)SQL Server经验,所以在回答时请使用几个音节的单词...

我正在运行SQL Server 2008 R2并尝试编写一个概念验证脚本,该脚本设置非分区,双向,事务复制。我已经设法从MS网站调整脚本工作,现在我正在尝试根据我们的需求进行自定义。这涉及将一堆值拉出变量。

我已将SSMS设置为“SQLCMD模式”,并且我的所有变量都可以解析,除了一个。

:setvar ReplicationDirectory 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2\MSSQL\repldata';

这给了我错误:

  

发生了致命的脚本错误。   解析时遇到错误的语法:setvar

我已将问题缩小到变量值中存在空格。根据我一直在阅读的内容,这应该没有问题。我试过用双打替换单引号(正常种类和角度类型)但都给了我同样的错误。

我在网上找不到任何告诉我应该如何逃避空间角色的东西。我看到的所有文章都说,如果字符串在引号中,SSMS只会将它们之间的任何内容解释为单个字符串 - 无论空格如何。

有没有人有任何想法?

我想我可以将变量的值更改为:

:setvar ReplicationDirectory 'C:\Progra~1\Micros~1\MSSQL10_50.SQL2\MSSQL\repldata';

但我宁愿解决“为什么我不能使用空格?”而不是问题。

非常感谢。

汤姆

2 个答案:

答案 0 :(得分:11)

使用双引号,而不是单引号:

:setvar ReplicationDirectory "C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2\MSSQL\repldata"

select '$(ReplicationDirectory)' as test

OR

:setvar ReplicationDirectory "'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2\MSSQL\repldata'"

select $(ReplicationDirectory) as test

SQLCMD模式变量实际上是命令行变量,而不是T-SQL变量(以@符号开头),您必须相应地设置它们。

答案 1 :(得分:2)

除了单引号字符串中的空格外,尾随分号还会引发问题。

空格和分号上的

:setvar test1 'test test';错误

空间

:setvar test1 'test test'错误

分号上的

:setvar test3 "test test";错误

:setvar test4 "test test"使变量中的空格可用作test test

:setvar test4 "'test test'"将单引号和变量中可用的空格设为'test test'