【问题标题】:Insert element into XML using XQuery in SQL Server在 SQL Server 中使用 XQuery 将元素插入 XML
【发布时间】:2015-08-19 11:41:35
【问题描述】:

我需要在存储过程中插入一个列,该存储过程读取 XML 作为输入并使用 SQL Server 中的 XQuery 读取 XML 值。

考虑一个表 dbo.emailDetails

Create Table dbo.emailDetails
(
     EmailId int,
     HomeEmail varchar(250),
);

XML 文件:

<EmailDetails xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <EmailId>1</EmailId>
    <HomeEmail>test@sample.com</HomeEmail>
</EmailDetails>

SQL Server 存储过程:

CREATE PROCEDURE [apply].[UpdateEmailDetails]
     @EmailDetails XML
 (DOCUMENT [dbo].[EmailDetails])
AS 
BEGIN
    DECLARE @EmailId INT, @HomeEmail NVARCHAR(250)

    SET @HomeEmail = @EmailDetails.value(N'(//EmailDetails/HomeEmail)[1]',N'NVARCHAR(255)');
    SET @EmailId = @EmailDetails.value(N'(//EmailDetails/EmailID)[1]',N'INT');

    INSERT INTO dbo.emails (emailid, homeemail) 
    VALUES (@EmailId, @HomeEmail )
END

现在我想在上述存储过程中包含IsConfirmed

 alter table dbo.Emaildetails
    add IsConfirmed bit not null default 0

----- Executed successfully and added the new column in the table.

虽然我在存储过程中尝试了以下更改:

Declare @IsConfirmed bit
SET @IsConfirmed = @EmailDetails.value(N'(//EmailDetails/IsConfirmed)[1]',N'BIT');

并得到错误:

XQuery [value()]: 'element(EmailDetails,#anonymous) *' 类型中没有名为 'IsConfirmed' 的元素。

有人可以帮我解决这个问题吗?

如果需要进一步的详细信息,请告诉我。

问候, 维斯瓦诉。

【问题讨论】:

  • 看起来您的变量命名在您的示例中无处不在,您的 SP 中有名为“@ContactDetails”的变量不存在,“//EmailDetails/IslConfirmed)[1]”节点名称不正确,“INSERT INTO dbo.emails”的表名称错误。除此之外,当你整理它时它工作正常,你确定你不会错过向我们展示其他东西吗?
  • 嗨,杰米,抱歉打错了。我已经编辑了页面。我想知道我的输入 XML 的语法,提到 (Document )。我不太了解 XML。你能帮我解释一下吗?

标签: sql-server xml xquery-sql


【解决方案1】:

您的存储过程有一个输入参数,如下所示:

@EmailDetails XML (DOCUMENT [dbo].[EmailDetails])

这意味着您定义了一个名为“[dbo].[EmailDetails]”的 XML 模式集合,它基本上说明了传入的 XML 应该采用什么格式。

如果您在数据库浏览器中展开 Programmability > Types > XML Schema Collections 节点,您将看到“[dbo].[EmailDetails]”模式。如果您然后右键单击并选择脚本为 > 创建到新窗口,您将看到传递给您的过程的 XML 中预期的节点。

您需要更改此架构以包含新的定义

<IsConfirmed>

节点。

一旦你改变它,你就应该能够再次运行你的 alter procedure 命令。

ThisMSDN 文章详细解释了该主题

【讨论】:

  • 嗨,杰米,非常感谢您的宝贵建议。您赶上了我的要求并准确地提供了解决方案。这就像一个魅力!百万谢谢你! :)
猜你喜欢
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
相关资源
最近更新 更多