Синтаксис TSQL не одинаков для SSMS и sqlcmd - PullRequest
0 голосов
/ 07 ноября 2019

Вот простой файл 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

1 Ответ

3 голосов
/ 07 ноября 2019

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):

enter image description here

enter image description here

Вы должны проверить, какие из них вы включили, а какие нет, затем вы можете добавить их в начале файла .sql.

Для этого конкретного примера SET QUOTED_IDENTIFIER заставляет выполнение с помощью sqlcmd неправильно идентифицировать имена ваших объектов, которые используют двойные кавычки, потому что для него установлено значение OFF. Вы можете добавить параметр -I в sqlcmd, чтобы установить этот параметр ON без изменения сценария.

...