Это хороший способ хранить данные XML в SQL Server 2008? - PullRequest
2 голосов
/ 20 октября 2011

Я делаю технико-экономическое обоснование для хранения данных в следующей структуре с SQL Server 2008:

-MYTABLE

|ID|RECORDS|BRANCH_OFFICE|MONTH|YEAR

Столбец RECORDS имеет тип данных XML и будет выглядеть следующим образом:

<visits>
  <visit id="000112233">
    <costumer>Mr. One Costumer</costumer>
    <date>2011-02-10</date>
    <employee>MAT01234</employee>
  </visit>
  <visit id="000112234">
    <costumer>Mr. Another Costumer</costumer>
    <date>2011-02-12</date>
    <employee>MAT01235</employee>
  </visit>
  <visit id="000112235">
    <costumer>Mr. Some Costumer</costumer>
    <date>2011-02-12</date>
    <employee>MAT01234</employee>
  </visit>
  <visit id="000112236">
    <costumer>Mr. Some Costumer</costumer>
    <date>2011-02-15</date>
    <employee>MAT01235</employee>
  </visit>
</visits>

Я собираюсь запросить столбец xml с помощью xquery, это хороший способ сохранить эти данные?

Если я хочу получить список посещений за 2011-10 годы, добавив тег с разницей в днях между тегом «дата» и сейчас, как это может быть?

1 Ответ

2 голосов
/ 20 октября 2011

Запрос к вашему XML может выглядеть примерно так, и я думаю, что ваша структура в порядке.Нет необходимости делать какие-то причудливые XML-вещи для получения необходимой информации.

declare @T table
(
  ID int identity primary key,
  Records xml
)

insert into @T values('
<visits>
  <visit id="000112233">
    <costumer>Mr. One Costumer</costumer>
    <date>2011-02-10</date>
    <employee>MAT01234</employee>
  </visit>
  <visit id="000112234">
    <costumer>Mr. Another Costumer</costumer>
    <date>2011-02-12</date>
    <employee>MAT01235</employee>
  </visit>
  <visit id="000112235">
    <costumer>Mr. Some Costumer</costumer>
    <date>2011-02-12</date>
    <employee>MAT01234</employee>
  </visit>
  <visit id="000112236">
    <costumer>Mr. Some Costumer</costumer>
    <date>2011-02-15</date>
    <employee>MAT01235</employee>
  </visit>
</visits>')


select T.ID,
       V.X.value('@id', 'nvarchar(10)') as VisitID,
       V.X.value('costumer[1]', 'nvarchar(50)') as Costumer,
       V.X.value('date[1]', 'date') as [Date],
       V.X.value('employee[1]', 'nvarchar(50)') as Employee
from @T as T
  cross apply T.Records.nodes('/visits/visit') as V(X)

Результат:

ID          VisitID    Costumer             Date       Employee
----------- ---------- -------------------- ---------- --------------------
1           000112233  Mr. One Costumer     2011-02-10 MAT01234
1           000112234  Mr. Another Costumer 2011-02-12 MAT01235
1           000112235  Mr. Some Costumer    2011-02-12 MAT01234
1           000112236  Mr. Some Costumer    2011-02-15 MAT01235
...