SQL Server 2005 Запрос данных столбца XML - PullRequest
3 голосов
/ 08 декабря 2010

У меня есть таблица с именем People со столбцами типа данных xml с именем properties.Я использовал это для хранения случайной информации о каждом человеке, в основном позволяя людям хранить любые дополнительные данные, которые будут добавлены в будущем без перепроектирования базы данных.Не у всех людей будут одинаковые элементы в XML.

CREATE TABLE [dbo].[Person](
 [PersonID] [bigint] IDENTITY(1,1) NOT NULL,
 [PersonType] [nvarchar](50) NULL,
 [Title] [nvarchar](5) NULL,
 [Forename] [nvarchar](60) NULL,
 [Surname] [nvarchar](60) NULL,
 [Company] [nvarchar](60) NULL,
 [Properties] [xml] NULL
)

Пример xml:

<PropertyList xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Property Name="Class">Class A</Property>
  <Property Name="CarRegistration">123456</Property>
  <Property Name="MedicalNotes">None</Property>
</PropertyList>

Первый вопрос: мне кажется, я не могу найти SQL-запрос, который позволил бы мне получить список записей, соответствующихкритерии хранятся в XML.

Например, как мне получить все записи, где Class="Class A".Я пробовал:

SELECT 
    PersonID, 
    Properties.value('/PropertyList/Property[@Name="Class"][1]','nvarchar(50)') 
FROM Person

Я знаю, что это неверно, но я получаю сообщение об ошибке "требуется одиночный код (или пустая последовательность)", и я не совсем уверен, что пошло не так.

И второй вопрос: я объединил несколько старых баз данных в один список пользователей, однако старые интерфейсы баз данных по-прежнему должны иметь доступ к своим битам данных.Мой план состоял в том, чтобы создать представление для каждого внешнего интерфейса базы данных с макетом, соответствующим его потребностям, со ссылкой на основную таблицу сотрудников.Однако некоторые из их полей теперь хранятся в XML.Есть ли способ создать представление для обновления XML, не видя xml, т.е. чтобы оно выглядело и действовало так же, как представление любой другой таблицы.Я надеюсь, что объяснил это правильно.Для каждого представления у меня будет определенный набор свойств XML, которые мне нужно отредактировать, и все записи будут иметь их, так что это не так случайно.

Спасибо за любую помощь.

1 Ответ

5 голосов
/ 08 декабря 2010

Ваш XQuery должен быть:

SELECT PersonID, 
       Properties.value('(/PropertyList/Property[@Name="Class"])[1]','NVARCHAR(50)') 
FROM dbo.Person

Помогает ли это ??

Обновление: , чтобы сделать его более понятным для других - я добавил круглые скобки вокруг/PropertyList/Property[@Name="Class"] выражение, так что это может привести к потенциально возможному списку значений, а затем [1] после скобок выберет первое (и чаще всего только) значение (в виде одиночного) этого списка, чтобы его можно было преобразоватьв NVARCHAR(50) строку.

value('(/PropertyList/Property[@Name="Class"])[1]','NVARCHAR(50)') 
       !                                     !

равно НЕ так же, как

value('/PropertyList/Property[@Name="Class"][1]','NVARCHAR(50)') 

Обновление 2: , если вы хотите создатьвид - конечно, нет причин не делать этого!; -)

Вы можете определенно создать что-то вроде:

CREATE VIEW dbo.YourViewName
AS
    SELECT
        PersonID, PersonType, Title, 
        ForeName, Surname, Company,
        Properties.value('(/PropertyList/Property[@Name="Class"])[1]','NVARCHAR(50)') AS 'Class',
        Properties.value('(/PropertyList/Property[@Name="CarRegistration"])[1]','NVARCHAR(50)') AS 'CarRegistration',
        Properties.value('(/PropertyList/Property[@Name="MedicalNotes"])[1]','NVARCHAR(50)') AS 'MedicalNotes'

из своей таблицы и "разбить" XML на столбцы в вашем представлении.Это то, что вы ищете ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...