在Sql Server中,我使用XML类型列来存储消息。我不想存储重复的消息。
我每个用户只会收到一些消息。我目前正在查询表中的这些消息,在我的C#代码中将XML转换为字符串。然后我将字符串与我要插入的内容进行比较。
不幸的是,Sql Server在XML类型字段中漂亮地打印数据。存储到数据库中的内容不一定与稍后返回的字符串完全相同。它在功能上是等效的,但可能会删除空格等等。
是否有一种有效的方法来比较我正在考虑插入的XML字符串和已经存在于数据库中的XML字符串?顺便说一句,如果我检测到重复,我需要删除旧消息,然后插入替换。
答案 0 :(得分:2)
0 - 向表中添加哈希列
1 - 当您收到新消息时,将整个XML转换为大写,删除所有空格并返回/换行,然后计算规范化字符串的散列值。
2 - 检查是否已有一行包含生成的哈希码。
答案 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可以处理整组表行。