【发布时间】: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