【问题标题】:Escaping Space Character using setvar in SQL Server Management Studio在 SQL Server Management Studio 中使用 setvar 转义空格字符
【发布时间】:2010-12-17 12:37:56
【问题描述】:

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

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

非常感谢。

汤姆

【问题讨论】:

    标签: sql-server-2008 sqlcmd


    【解决方案1】:

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

    :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 变量(以 @ 符号开头),您必须相应地设置它们。

    【讨论】:

    • 几个小时前我在另一个答案上发表了评论,但它似乎已经消失了。使用双引号只会导致相同的错误(即使我删除了空格)。使用单引号和双引号也会导致相同的错误。我看过一些文章,如你所见,我已将他们的示例复制并粘贴到我的代码中,但仍然出现此错误。
    • @Tom - 这两个示例都适用于 SQL 2008 开发人员和标准、SP1 和 SP2、64 位。您是否在仅使用 setvar 分配而没有其他命令的脚本中收到错误?
    • 谢谢。路径中的空间让我大吃一惊。
    【解决方案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'

    【讨论】:

      猜你喜欢
      • 2021-01-18
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多