首页 > 解决方案 > 从查询错误中插入 XML 字段 - QUOTED_IDENTIFIER ON 无法修复

问题描述

我需要使用来自另一个表的查询将许多行插入到一个表中。我遇到的这个问题是我要插入的列之一是 XML(我需要在其中嵌入查询中的值)但是当我尝试在 SSMS 中运行插入语句时,我得到

消息 1934 INSERT 失败,因为以下 SET 选项的设置不正确:'QUOTED_IDENTIFIER'。

我尝试将 QUOTED_IDENTIFIER 设置为 ON,但仍然遇到相同的错误。我在批处理和单独的批处理中尝试了它(SET 语句后跟 GO,在 Insert 语句之前。

我在此表中没有索引视图、过滤索引或计算列。查看表属性,我看到引用标识符为真。

这是我想要做的事情的本质。列 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 上运行。我们非常感谢所有建议。

标签: sql-serverxmlsql-insert

解决方案


请尝试以下概念示例。

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> |
+----+------+-----------------------------------+

推荐阅读