我需要在存储过程中插入一个列,该列读取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'的元素。
有人可以帮我这个吗?
如果需要进一步细节,请告诉我。
此致 Viswa V。
答案 0 :(得分:1)
您的存储过程有一个输入参数,如下所示:
@EmailDetails XML (DOCUMENT [dbo].[EmailDetails])
这意味着你有一个名为&#34; [dbo]的XML Schema Collection。[EmailDetails]&#34;定义了哪个基本上说明了传入XML应该采用的格式。
如果扩展可编程性&gt;类型&gt;数据库资源管理器中的XML Schema Collections节点您将看到&#34; [dbo]。[EmailDetails]&#34;架构。如果您然后右键单击并选择脚本为&gt;创建新窗口,您将看到在传递给过程的XML中预期有哪些节点。
您需要更改此架构以包含新
的定义<IsConfirmed>
节点。
一旦你改变它,你就应该能够再次运行你的alter procedure命令。
This MSDN文章详细介绍了该主题