`bcp in`失败,并显示“ INSERT失败,因为以下SET选项设置不正确:'QUOTED_IDENTIFIER'”

问题描述 投票:0回答:1

我用bcp %database%.MyTable out MyTable.dmp -n -T -S %sqlserver%导出了一个表(使用EF Core 2.2创建)。

在使用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创建的,不包含任何computed column

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
sql-server bcp sql-server-2017
1个回答
3
投票

BCP utilityQUOTED_IDENTIFIER OFF连接以实现向后兼容。您需要添加-q选项才能使用QUOTED_IDENTIFIER ON

当指定了-q选项时,BCP文档指示整个合格的表名都用引号引起来。但是,当数据库名称不符合regular identifier naming rules时,这将不起作用。数据库名称中的句点是罪魁祸首。

一种解决方法是指定一个由两部分组成的表名,并使用-d选项分别指定数据库名:

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

恕我直言,最好根据常规标识符的规则为对象命名,以避免需要将名称括起来并绕过这一行。

该错误消息建议您在需要QUOTED_IDENTIFIER ON的计算列上使用索引以外的其他功能。这些包括过滤索引,索引视图和XML索引。我的猜测是这里的过滤索引或索引视图是罪魁祸首。

© www.soinside.com 2019 - 2024. All rights reserved.