"BCP IN"操作失败并显示“由于以下SET选项设置不正确:'QUOTED_IDENTIFIER',导致INSERT操作失败。”

4

我使用 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

SET QUOTED_IDENTIFIER 是一个连接属性。听起来你的连接默认使用了 SET QUOTED_IDENTIFIER OFF。尝试添加 -q 开关。 - Thom A
“无法使其正常工作。”这是什么意思?出现了什么错误或意外行为。“不起作用”并没有告诉我们任何信息。 - Thom A
@Dan @Lamu 不幸的是,在 bcp [My.Database].[MySchema].[MyTable] in MyTable.dmp -q -n -T -S(localdb)\ MSSQLLocalDB 中,我收到了“需要有效的表名以供选项使用。”的错误提示。我尝试过多种不同方式来输入表/数据库/模式名称(包括方括号和无方括号),但问题依然存在。此为bcp版本14。 - gumo
我应该开一个新问题并删除这个问题吗?请注意,此处的“-q”是指命令行选项。 - gumo
1
@gumo,看起来 -q 和数据库名称不符合常规标识符命名的组合是问题所在。我很快会发布答案。 - Dan Guzman
显示剩余2条评论
1个回答

12
BCP实用程序为了向后兼容,连接时使用QUOTED_IDENTIFIER OFF。您需要添加-q选项才能使用QUOTED_IDENTIFIER ON
当指定-q选项时,BCP文档要求将整个限定表名用引号括起来。然而,当数据库名称不符合常规标识符命名规则时,这种方法不起作用。数据库名称中的句点是罪魁祸首。
解决办法是指定一个由2部分组成的表名,并使用-d选项单独指定数据库名称:
bcp "MySchema.MyTable" in "MyTable.dmp" -q -n -T -S "(localdb)\MSSQLLocalDB" -d "My.Database"

在我看来,最好根据常规标识符的规则命名对象,以避免需要将名称括起来并像这样跳过障碍。

错误消息表明您正在使用计算列上除索引之外的其他功能,这些功能需要QUOTED_IDENTIFIER ON。 这些功能包括过滤索引、索引视图和XML索引。 我猜测问题出在过滤索引或索引视图上。


非常好用,谢谢。我不知道命名规则,说得好! - gumo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接