4

首先,我不是 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';

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

非常感谢。

汤姆

4

2 回答 2

11

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

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

select '$(ReplicationDirectory)' as test

或者

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

select $(ReplicationDirectory) as test

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

于 2010-12-17T15:50:41.253 回答
3

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

:setvar test1 'test test';空格和分号错误

:setvar test1 'test test'空间错误

:setvar test3 "test test";分号上的错误

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

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

于 2016-03-02T21:55:18.683 回答