Sql Server XML类型列重复条目检测

时间:2010-03-09 18:12:21

标签: sql-server xml

在Sql Server中,我使用XML类型列来存储消息。我不想存储重复的消息。

我每个用户只会收到一些消息。我目前正在查询表中的这些消息,在我的C#代码中将XML转换为字符串。然后我将字符串与我要插入的内容进行比较。

不幸的是,Sql Server在XML类型字段中漂亮地打印数据。存储到数据库中的内容不一定与稍后返回的字符串完全相同。它在功能上是等效的,但可能会删除空格等等。

是否有一种有效的方法来比较我正在考虑插入的XML字符串和已经存在于数据库中的XML字符串?顺便说一句,如果我检测到重复,我需要删除旧消息,然后插入替换。

4 个答案:

答案 0 :(得分:2)

0 - 向表中添加哈希列

1 - 当您收到新消息时,将整个XML转换为大写,删除所有空格并返回/换行,然后计算规范化字符串的散列值。

2 - 检查是否已有一行包含生成的哈希码。

  • 如果是的话,这是重复的,对待它 相应
  • 如果没有,请将原始XML与散列一起存储在新行中

答案 1 :(得分:1)

我对你的确切实现并不是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  
)

答案 2 :(得分:0)

一种解决方案是停止使用XML类型字段。将XML字符串存储到varchar类型字段中。

我真的不喜欢这个解决方案,但我也不喜欢p.marino的解决方案。存储表中行中已存在的东西的散列似乎不正确。

答案 3 :(得分:0)

如果在表中的每一行上使用OPENXML并查询关键节点和/或关键属性的实际XML信息,该怎么办?但是你需要逐行进行,我不认为OPENXML可以处理整组表行。

相关问题