【问题标题】:`bcp in` fails with "INSERT failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'"`bcp in` 失败并显示“插入失败,因为以下 SET 选项的设置不正确:'QUOTED_IDENTIFIER'”
【发布时间】:2020-01-10 09:12:01
【问题描述】:

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

【问题讨论】:

  • SET QUOTED_IDENTIFIER 是一个连接属性。听起来您默认使用SET QUOTED_IDENTIFIER OFF 进行连接。尝试添加-q 开关。
  • @Lamu 那么我应该把-q. I get 放在哪里?输入、输出或格式选项都需要有效的表名。`无论我把-q放在哪里。
  • “不能让它工作。” 这是什么意思?什么是错误或意外行为。 “不起作用”并不能告诉我们任何事情。
  • @gumo,您应该可以在位置参数之后的任何位置指定-q 选项。我希望这会起作用:bcp %database%.MyTable in MyTable.dmp -q -n -T -S %sqlserver%
  • @gumo,似乎-q 和不符合常规标识符命名的数据库名称的组合是问题所在。我会尽快发布答案。

标签: sql-server bcp sql-server-2017


【解决方案1】:

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 索引。我的猜测是过滤索引或索引视图是这里的罪魁祸首。

【讨论】:

  • 像魅力一样工作,谢谢。我不知道命名规则。好点子!
猜你喜欢
  • 2017-03-22
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多