Sql Server обнаружение повторяющихся записей в столбце типа XML - PullRequest
3 голосов
/ 09 марта 2010

В Sql Server я использую столбец типа XML для хранения сообщения. Я не хочу хранить повторяющиеся сообщения.

У меня будет только несколько сообщений на пользователя. В настоящее время я запрашиваю таблицу для этих сообщений, преобразуя XML в строку в моем коде C #. Затем я сравниваю строки с тем, что собираюсь вставить.

К сожалению, Sql Server довольно печатает данные в типизированных полях XML. То, что вы храните в базе данных, не обязательно совпадает с той, что вы получаете позже. Он функционально эквивалентен, но может удалить пробел и т. Д.

Существует ли эффективный способ сравнения XML-строки, которую я собираюсь вставить, с теми, которые уже есть в базе данных? Кроме того, если я обнаружу дубликат, мне нужно удалить старое сообщение, а затем вставить замену.

Ответы [ 4 ]

2 голосов
/ 09 марта 2010

0 - добавить хеш-столбец в вашу таблицу

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

2 - проверьте, есть ли у вас строка с результирующим хеш-кодом в ней.

  • Если да, то это дублируется, обработайте это соответственно
  • Если нет, сохраните исходный XML вместе с хешем в новой строке
1 голос
/ 22 мая 2010

Я не уверен на 100% в вашей точной реализации, но вот кое-что, с чем я поиграл. Идея быть хранимой процедурой сделает вставку. При вставке в таблицу сообщений выполняется базовая проверка существующих сообщений (синтаксис SQL 2008):

declare @messages table (msg xml)
insert into @messages values 
('<message>You like oranges</message>')
,('<message>You like apples</message>')

declare @newMessage xml = '<message>You like apples</message>'

insert into @messages (msg)
select @newMessage
where @newMessage.value('(message)[1]', 'nvarchar(50)') not in (
  select msg.value('(message)[1]', 'nvarchar(50)')
  from @messages  
)
0 голосов
/ 02 мая 2010

Что если вы используете OPENXML в каждой строке таблицы и запрашиваете фактическую информацию XML для ключевых узлов и / или ключевых атрибутов? Но тогда вам нужно делать это построчно, я не думаю, что OPENXML работает с целым набором строк таблицы.

0 голосов
/ 17 марта 2010

Одним из решений является прекращение использования типизированного поля XML. Сохраните строку XML в поле типа varchar.

Мне не очень нравится это решение, но мне не очень нравится решение p.marino. Кажется неправильным хранить хэш чего-то, что уже находится в строке в таблице.

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