`bcp in` завершается с ошибкой" INSERT не удалось, поскольку следующие параметры SET имеют неправильные настройки: "QUOTED_IDENTIFIER" " - PullRequest
0 голосов
/ 10 января 2020

Я экспортировал таблицу (созданную с помощью EF Core 2.2) с bcp %database%.MyTable out MyTable.dmp -n -T -S %sqlserver%.

При повторном импорте с bcp %database%.MyTable in MyTable.dmp -n -T -S %sqlserver% я получаю эту ошибку:

SQLState = 37000, NativeError = 1934
Error = [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]INSERT failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'. Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or filtered indexes and/or query notifications and/or XML data type methods and/or spatial index operations.

Таблица создана с QUOTED_IDENTIFIER = ON и не содержит вычисляемый столбец :

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [MyTable](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [OwnerLoginId] [bigint] NOT NULL,
    [RowVersion] [timestamp] NULL,
    [CreatedAt] [datetime2](7) NOT NULL,
    [DataId] [bigint] NOT NULL,
    [SomeString] [nvarchar](30) NOT NULL,
    [AnotherString] [nvarchar](30) NULL,
 CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [MyTable]  WITH CHECK ADD  CONSTRAINT [FK_MyTable_SomeOtherTable_DataId_SomeString] FOREIGN KEY([DataId], [SomeString])
REFERENCES [SomeOtherTable] ([DataId], [SomeString])
GO

ALTER TABLE [MyTable] CHECK CONSTRAINT [FK_MyTable_SomeOtherTable_DataId_SomeString]
GO

ALTER TABLE [MyTable]  WITH CHECK ADD  CONSTRAINT [FK_MyTable_DataTable_DataId] FOREIGN KEY([DataId])
REFERENCES [DataTable] ([Id])
GO

ALTER TABLE [MyTable] CHECK CONSTRAINT [FK_MyTable_DataTable_DataId]
GO

1 Ответ

4 голосов
/ 10 января 2020

Утилита BCP соединяется с QUOTED_IDENTIFIER OFF для обратной совместимости. Вам нужно будет добавить параметр -q, чтобы использовать QUOTED_IDENTIFIER ON.

. В документации BCP указывается, что полное квалифицированное имя таблицы должно быть заключено в кавычки, если указан параметр -q. Однако это не работает, если имя базы данных не соответствует правилам именования обычных идентификаторов . Здесь виноват период в имени базы данных.

Обходной путь - указать имя таблицы из двух частей и указать имя базы данных отдельно, используя параметр -d:

bcp "MySchema.MyTable" in "MyTable.dmp" -q -n -T -S "(localdb)\MSSQLLocalDB" -d "My.Database"

ИМХО, лучше называть объекты в соответствии с правилами для регулярных идентификаторов, чтобы избежать необходимости заключать в себе имена и прыгать через обручи следующим образом.

Сообщение об ошибке предполагает, что вы используете другие функции, помимо индексов для вычисляемых столбцов которые требуют QUOTED_IDENTIFIER ON. К ним относятся отфильтрованные индексы, индексированные представления и XML индексы. Я думаю, что отфильтрованный индекс или индексированное представление является виновником здесь.

...