SSMS 和 sqlcmd 的 TSQL 语法不同

TSQL syntax not the same for SSMS and sqlcmd

这是一个简单的 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 加载它时,一切正常:

当我通过 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

SQL服务器有一个QUOTE_IDENTIFIER {ON|OFF}选项,它修改了TSQL查询中"的效果。

您可以使用 -I 选项通过 sqlcmd 打开它:

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

或者在您的 sql 脚本中明确添加以下指令:

SET QUOTED_IDENTIFIER ON;

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

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

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