Извлечение данных из типа данных XML в SQL

У меня есть таблица с именем TeacherTbl, которая выглядит так:

TeacherTbl:

TeacherID INT PRIMARY KEY    
TeacherBlob XML

Поле TeacherBlob выглядит следующим образом:

<Teacher>
. . .
    <TeacherClass>
        <FormRoom> Room A</FormRoom>
        <TotalStudents> 25 </TotalStudents>
        <Subject> Mathematics </Subject>
            <Student>
                <StudentName> James </StudentName>
                <StudentAge> 15 </StudentAge>
                <StudentAddress> </StudentAddress>
            </Student>
    </TeacherClass>
</Teacher>

Я написал хранимую процедуру для навигации по этому XML и извлечения значений узлов TeacherClass и Subject в отдельные реляционные таблицы, которые вставляются в таблицы TeacherClass и Subject соответственно.

В основном я хочу выбрать идентификаторы из XML-файла TeacherBlob, которые не имеют существующих данных в таблицах TeacherClass и Subject (т. е. оператор INSERT в моей хранимой процедуре не выполнен). Я хочу выбрать идентификатор только тогда, когда родительский узел является учителем и имеет дочерний элемент TeacherClass (TeacherClass может не существовать для учителя).

Кроме того, я должен попытаться повторно вставить эти данные xml в узлы TeacherClass и Subject при условии, что данные еще не существуют в таблицах (что должно быть сделано в отдельном сценарии). Однако это не моя основная проблема - я изо всех сил пытаюсь выбрать идентификаторы, которые имеют Учитель и Учительский класс в TeacherBlob, учитывая, что я не знаком с XML как типом поля в T-SQL.

Любая помощь с этим будет здорово.


person Mark    schedule 23.02.2017    source источник
comment
Я не могу помочь вам с вашей конкретной проблемой, но я хотел бы подчеркнуть, что здесь вы занимаетесь реляционным › XML › реляционным хранилищем. Это было бы намного проще, если бы вы просто хранили данные непосредственно реляционно (т.е. в таблице учителя, таблице класса, таблице предмета, таблице ученика). У вас могут быть причины для того, что вы делаете, но вы, возможно, захотите пересмотреть свое решение.   -  person Nick.McDermaid    schedule 23.02.2017
comment
К сожалению, это была спецификация, которую мне дали - мне пришлось реализовать свое решение так, как я это сделал.   -  person Mark    schedule 23.02.2017
comment
Какой XPath вы используете в настоящее время и какие у вас проблемы с ним?   -  person Nick.McDermaid    schedule 23.02.2017
comment
здесь я дал вам ответ как читать эту структуру. Если я правильно понимаю вашу проблему, нет чистого пути, потому что нет уникальных ключей. Студент Джеймс может существовать дважды... И вы никогда не должны хранить возраст как INT! Что будет в следующем году? Предоставьте уменьшенный, но реалистичный автономный образец. Вы можете использовать мой код из ответа на соответствующий вопрос. Затем покажите нам ожидаемый результат. В данный момент нет возможности помочь вам...   -  person Shnugo    schedule 23.02.2017