从查询错误中插入 XML 字段 - QUOTED_IDENTIFIER ON 无法修复
Inserting XML field from query error - QUOTED_IDENTIFIER ON does not fix
我需要使用来自另一个 table 的查询将一些行插入 table。我遇到的这个问题是,我要插入的列之一是 XML(我需要从查询中嵌入一个值)但是当我尝试 运行 SSMS 中的插入语句时,我得到
消息 1934 INSERT 失败,因为以下 SET 选项设置不正确:'QUOTED_IDENTIFIER'。
我已经尝试将 QUOTED_IDENTIFIER 设置为 ON,但我仍然遇到同样的错误。我在批处理中和单独的批处理中尝试了它(SET 语句后跟 GO,在 Insert 语句之前。
我在此 table 中没有索引视图、过滤索引或计算列。查看 table 属性,我看到 Quoted Identifier is True.
这是我正在尝试做的事情的本质。 Area、Action 和 EntityType 列是 int,Data 是 XML,Title 是 nvarchar(20).
INSERT INTO AuditLog ( [Area], [Action], [EntityType], [Data] )
SELECT (1,2,1,'<Name>' + [Title] + '<\Name>')
FROM [Records] WHERE [TypeId] = 3;
我可以创建一个 XML 变量并使用它,但是我需要能够插入多条记录并且我真的不想求助于游标来做一些看起来如此简单的事情。即使我使用简单的静态引用 XML 或使用 CAST 或 CONVERT 我也有同样的错误。
我正在 运行 使用最新的 SSMS (2019) SQL Server Standard 2016。非常感谢收到所有建议。
请尝试以下概念示例。
XML
数据类型不能被视为 VARCHAR/NVARCHAR
数据类型。
所需的 XML 可以通过 SELECT ... FOR XML ...
轻松组合
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, Area INT, Title XML);
INSERT INTO @tbl (Area, Title) VALUES
(770, N'<root>Manager</root>');
DECLARE @target TABLE (ID INT IDENTITY PRIMARY KEY, Area INT, [DATA] XML);
-- DDL and sample data population, end
INSERT INTO @target (Area, [DATA])
SELECT Area
, (
SELECT title AS [Name]
FOR XML PATH(''), TYPE
) AS [DATA]
FROM @tbl;
-- test
SELECT * FROM @target;
输出
+----+------+-----------------------------------+
| ID | Area | DATA |
+----+------+-----------------------------------+
| 1 | 770 | <Name><root>Manager</root></Name> |
+----+------+-----------------------------------+
我已经解决了这个问题,但我最初不确定为什么它在几乎没有变化的情况下起作用,但最终我发现我是 运行 在具有 [=12] 的数据库上下文中的查询=] OFF(这是源数据所在的位置),而插入结果的数据库 QUOTED_IDENTIFIER ON,因此更改执行的上下文(代理作业步骤)解决了这个问题。源数据库是第三方应用程序的一部分,因此更改 QUOTED_IDENTIFER 设置会产生未知后果。
我需要使用来自另一个 table 的查询将一些行插入 table。我遇到的这个问题是,我要插入的列之一是 XML(我需要从查询中嵌入一个值)但是当我尝试 运行 SSMS 中的插入语句时,我得到
消息 1934 INSERT 失败,因为以下 SET 选项设置不正确:'QUOTED_IDENTIFIER'。
我已经尝试将 QUOTED_IDENTIFIER 设置为 ON,但我仍然遇到同样的错误。我在批处理中和单独的批处理中尝试了它(SET 语句后跟 GO,在 Insert 语句之前。
我在此 table 中没有索引视图、过滤索引或计算列。查看 table 属性,我看到 Quoted Identifier is True.
这是我正在尝试做的事情的本质。 Area、Action 和 EntityType 列是 int,Data 是 XML,Title 是 nvarchar(20).
INSERT INTO AuditLog ( [Area], [Action], [EntityType], [Data] )
SELECT (1,2,1,'<Name>' + [Title] + '<\Name>')
FROM [Records] WHERE [TypeId] = 3;
我可以创建一个 XML 变量并使用它,但是我需要能够插入多条记录并且我真的不想求助于游标来做一些看起来如此简单的事情。即使我使用简单的静态引用 XML 或使用 CAST 或 CONVERT 我也有同样的错误。
我正在 运行 使用最新的 SSMS (2019) SQL Server Standard 2016。非常感谢收到所有建议。
请尝试以下概念示例。
XML
数据类型不能被视为 VARCHAR/NVARCHAR
数据类型。
所需的 XML 可以通过 SELECT ... FOR XML ...
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, Area INT, Title XML);
INSERT INTO @tbl (Area, Title) VALUES
(770, N'<root>Manager</root>');
DECLARE @target TABLE (ID INT IDENTITY PRIMARY KEY, Area INT, [DATA] XML);
-- DDL and sample data population, end
INSERT INTO @target (Area, [DATA])
SELECT Area
, (
SELECT title AS [Name]
FOR XML PATH(''), TYPE
) AS [DATA]
FROM @tbl;
-- test
SELECT * FROM @target;
输出
+----+------+-----------------------------------+
| ID | Area | DATA |
+----+------+-----------------------------------+
| 1 | 770 | <Name><root>Manager</root></Name> |
+----+------+-----------------------------------+
我已经解决了这个问题,但我最初不确定为什么它在几乎没有变化的情况下起作用,但最终我发现我是 运行 在具有 [=12] 的数据库上下文中的查询=] OFF(这是源数据所在的位置),而插入结果的数据库 QUOTED_IDENTIFIER ON,因此更改执行的上下文(代理作业步骤)解决了这个问题。源数据库是第三方应用程序的一部分,因此更改 QUOTED_IDENTIFER 设置会产生未知后果。