Вставить элемент в XML с помощью XQuery в SQL Server

Мне нужно вставить столбец в хранимую процедуру, которая считывает XML в качестве входных данных и считывает значение XML с помощью XQuery в SQL Server.

Рассмотрим таблицу 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>[email protected]</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 ()]: нет элемента с именем «IsConfirmed» в типе «element (EmailDetails, # anonymous) *».

Может ли кто-нибудь помочь мне с этим?

Пожалуйста, дайте мне знать, если потребуется дополнительная информация.

С уважением, Висва В.


person salaiviswa    schedule 19.08.2015    source источник
comment
Похоже, что имя вашей переменной в вашем примере повсюду, у вас есть переменные с именем @ContactDetails в вашем SP, которые не существуют, // EmailDetails / IslConfirmed) [1] имеет неправильное имя узла, INSERT INTO dbo.emails имеет неправильное имя таблицы. Кроме этого, когда вы приводите его в порядок, он работает нормально, вы уверены, что не упускаете возможности показать нам что-то еще?   -  person Jamie Pollard    schedule 19.08.2015
comment
Привет, Джейми, извини за опечатку. Я отредактировал страницу. Я хочу знать синтаксис моего входного XMl, упоминаемого как (Document ‹TableName›). Я не очень разбираюсь в XML. Не могли бы вы помочь мне объяснить это?   -  person salaiviswa    schedule 19.08.2015


Ответы (1)


Ваша хранимая процедура имеет входной параметр, который выглядит следующим образом:

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

Это означает, что у вас есть коллекция схем XML с именем «[dbo]. [EmailDetails]», которая в основном указывает, в каком формате должен быть входящий XML.

Если вы развернете узлы Программируемость> Типы> Коллекции схем XML в проводнике базы данных, вы увидите свою схему «[dbo]. [EmailDetails]». Если затем щелкнуть правой кнопкой мыши и выбрать Сценарий как> Создать в новом окне, вы увидите, какие узлы должны быть в XML, который вы передаете своей процедуре.

Вам нужно ИЗМЕНИТЬ эту схему, чтобы включить определение для вашего нового

<IsConfirmed>

узел.

После того, как вы его измените, вы сможете снова запустить команду изменения процедуры.

В этой статье MSDN более подробно рассматривается тема.

person Jamie Pollard    schedule 19.08.2015
comment
Привет, Джейми! Большое спасибо за ваше ценное предложение. Вы уловили мои требования и точно предоставили решение. Это работает как шарм! Миллион спасибо тебе! :) - person salaiviswa; 21.08.2015