【问题标题】:TSQL syntax not the same for SSMS and sqlcmdSSMS 和 sqlcmd 的 TSQL 语法不同
【发布时间】:2019-11-07 09:57:44
【问题描述】:

这是一个简单的 tsql 文件:

# file foo.sql :
DROP TABLE IF EXISTS "Testing";

CREATE TABLE "Testing"
(
    "Id" BIGINT NOT NULL,
    "FilePath" NVARCHAR (442) NULL,
    CONSTRAINT "PK_Testing" PRIMARY KEY CLUSTERED ("Id" ASC)
);

GO

当我通过 SQL Server Management Studio 加载它时,一切正常:

  • 连接服务器,选择数据库
  • 打开文件'foo.sql'
  • 运行“执行”
  • 输出:

    Commands completed successfully.
    
    Completion time: 2019-11-07T10:48:37.3336032+01:00
    

当我通过sqlcmd 将其用作输入时,我收到一个错误:

> sqlcmd -S .\SQLEXPRESS -d DemoDb -i foo.sql
Msg 102, Level 15, State 1, Server MY-LAPTOP\SQLEXPRESS, Line 1
Incorrect syntax near 'Testing'.

问题

我如何告诉sqlcmd 在这种情况下表现得像 SSMS?

我应该使用另一个类似于 SSMS 的命令行工具吗?


版本信息:

> sqlcmd -?
Microsoft (R) SQL Server Command Line Tool
Version 15.0.1300.359 NT
Copyright (C) 2019 Microsoft Corporation. All rights reserved.

usage: ...

SSMS:v18.3.1

Component name                              Versions
SQL Server Management Studio                15.0.18183.0
Microsoft Analysis Services Client Tools    15.0.1487.0
Microsoft Data Access Components (MDAC)     10.0.18362.1
Microsoft MSXML                             3.0 6.0 
Microsoft Internet Explorer                 9.11.18362.0
Microsoft .NET Framework                    4.0.30319.42000
Operating System                            10.0.18362

【问题讨论】:

  • 尝试删除所有双引号,您不需要它们来分隔对象名称。如果它们有特殊字符,您可以将它们包装在 [] 中,但我在这个例子中没有看到。问题很可能是 SSMS 在后台使用带引号的标识符设置的会话变量。
  • 我的问题更偏向一边:为什么一种格式被一个 shell 接受而被另一个 shell 拒绝? sqlcmd 中的" 有什么特别之处?
  • 尝试在脚本开头添加SET QUOTED_IDENTIFIER ON;,这将允许对对象使用双引号。默认情况下,SSMS 可能会将此设置为 ON,而 sqlcmd 可能不会。 docs.microsoft.com/en-us/sql/t-sql/statements/…
  • @Ezlo 实际上他不需要在脚本中添加任何内容。他可以使用-I(启用带引号的标识符)开关运行sqlcmd
  • 正如@tukan 所说,您应该使用 -I 标志运行 sqlcmd 以在脚本中启用双引号标识符

标签: sql-server ssms sqlcmd


【解决方案1】:

SQLServer 有一个QUOTE_IDENTIFIER {ON|OFF} 选项,可以修改" 在TSQL 查询中的效果。

您可以使用sqlcmd 选项打开它,方法是使用-I 选项:

sqlcmd -I -S .\SQLEXPRESS -d DemoDb -i foo.sql

或通过在您的 sql 脚本中显式添加以下指令:

SET QUOTED_IDENTIFIER ON;

SSMS 通常在您连接到服务器时设置一堆会话配置。您可以在 SQL Server 下的 选项 窗口中找到它们(这是旧 SSMS 2008 中的示例):

您应该检查哪些已启用,哪些未启用,然后您可以将它们添加到 .sql 文件的开头。

对于这个特定的示例,SET QUOTED_IDENTIFIER 使sqlcmd 的执行无法正确识别使用双引号的对象名称,因为它设置为OFF。您可以在sqlcmd 上添加-I 参数来设置此设置ON,而无需同时修改脚本。

【讨论】:

    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多