Разбор столбца xml (varchar) в таблице, которая должна создать представление - PullRequest
0 голосов
/ 07 апреля 2020
@xml =      N'<School>
    <Name>
        <Id>123456</ID>
    </Name>
    <Grade> 
        <FirstGrade>80</FirstGrade>
    </Grade> 
            </School>',

Эта часть выше представляет собой столбец varchar в Schooltable, который содержит несколько других столбцов. Я просто хочу разобрать schooldata xml, который содержит xml и отформатирован как varchar.

Это то, что я пробовал

create view school as

 select CAST(CAST(schooldataxml as nvarchar(max)) as XML).query('school/Name/Id') Col
    from schooltable

Здесь я пытаюсь привести его как утверждение, однако он не убирает теги html. Я тоже пробовал узлы, но безуспешно

Я получаю это

<Id>123456</ID>

Я хочу получить это для каждой строки в новом столбце в моем новом представлении

123456 

Обратите внимание, что мне нужно разбирать каждую строку в моем новом столбце один за другим. Таким образом, следующее значение, которое необходимо проанализировать, - это другое: динамические c значения.

1 Ответ

1 голос
/ 07 апреля 2020

Добро пожаловать в StackOverflow.

Обратите внимание на этот код:

DECLARE @xml XML =
N'<School>
    <Name>
        <ID>123456</ID>
    </Name>
    <Grade> 
        <FirstGrade>80</FirstGrade>
    </Grade> 
</School>';

SELECT @xml.query('/School/Name/ID'); --<< THIS
SELECT @xml.query('(/School/Name/ID/text())[1]'); --<< NEEDS TO BE THIS
SELECT @xml.value('(/School/Name/ID/text())[1]','VARCHAR(100)'); -- EVEN BETTER

С query вам необходимо указать тип узла в выражении XPath; поведение по умолчанию - возвращать узел XML.

Для того, что вы делаете, метод value , вероятно, даст лучшую производительность.

против таблицы:

DECLARE @schooltable TABLE (schooldataxml XML);
INSERT @schooltable VALUES(
N'<School>
    <Name>
        <ID>123456</ID>
    </Name>
    <Grade> 
        <FirstGrade>80</FirstGrade>
    </Grade> 
</School>'),(
N'<School>
    <Name>
        <ID>555444</ID>
    </Name>
    <Grade> 
        <FirstGrade>90</FirstGrade>
    </Grade> 
</School>');

SELECT SomeId = s.schooldataxml.value('(/School/Name/ID/text())[1]','VARCHAR(100)')
FROM   @schooltable AS s;

Возвращает:

SomeId
----------
123456
555444
...