首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在SQLServer中规范化XML以进行散列

在SQLServer中规范化XML以进行散列
EN

Stack Overflow用户
提问于 2012-10-02 10:42:39
回答 1查看 243关注 0票数 1

我问这个问题,这导致我做了以下工作。

  • 创建C#对象结构的XML表示,以便将其传递给SQLServer。
  • 创建一个存储过程,该存储过程对XML进行散列处理,然后将XML分解为相关表,并将散列存储在根表中,以便快速查找。

这意味着我可以将复杂的对象数据传递给SQLServer,并对哈希进行查找,而不是尝试将XML分解并与表进行匹配(我也可以这样做,但速度很慢(呃)).

然而,XML的优点之一是可以格式化它,例如缩进它等等,而且属性顺序也不重要。但是,当您散列某些内容时,格式化和缩进是很重要的。所以我在C#做的是..。

  • 通过按字母顺序排列所有属性来规范XML
  • 使用.ToString(DisableFormatting)删除额外的格式化空间

这很好,但是当我进行测试时,格式化XML就更容易了,这样我就可以更容易地看到我要传递给存储的proc的内容。

如果SQLServer可以被信任来保存属性顺序但它不能,那就太好了.

XML实例中的属性顺序没有保留。当查询存储在XML类型列中的xml实例时,结果XML中的属性顺序可能与原始XML实例不同。

这意味着我不能使用SQLServer的XML数据类型来规范数据。

困扰我的是,在某个时候,有人会使用我的过程,并认为“哦,好极了,XML,属性顺序不重要,格式化不重要,表示的数据是相同的”,然而,当我散列时,情况就不是这样了。

有人找到解决这个问题的办法了吗?我真的不想用T编写XML解析器!或者使用其他人编写的XML解析器来规范XML解析器。为什么SQLServer XML数据类型不能只保留属性顺序?

我想我可以“信任”我的应用程序总是以相同的格式/顺序传递XML,从而为同一个对象生成相同的散列。但是我不喜欢这样的想法,即存储的proc也必须“信任”应用程序才能做到这一点。我希望能够以某种方式检查XML的规范化,它显然会更加健壮。

EN

Stack Overflow用户

发布于 2013-08-21 12:54:18

我将尝试序列化存储过程中的对象。

让我们来介绍以下课程:

代码语言:javascript
运行
复制
class MyCustomObject 
{
    int id;
    string SomeField;
}

然后,您可以使用一个存储过程,在这个过程中,您用Xml序列化对象并计算输入参数的校验和,然后在另一个过程中,您可以传递一个HashValue(校验和)和一个xml。通过反序列化Xml可以计算Xml中字段的校验和,并将其与传递的HashValue进行比较。

试试下面的代码:(注意,您应该存储散列值,并将其返回给调用方,然后使用xml执行一些操作)

代码语言:javascript
运行
复制
CREATE PROCEDURE HashObject(@id int, @SomeField varchar(255)) AS
BEGIN
    SELECT
        CHECKSUM(@id, @SomeField) AS CalculatedHashValue,
        (SELECT @id AS ID, @SomeField AS SomeField FOR XML RAW('xmlRowName')) AS Xml_Data,
        @id AS SPCall_ID,
        @SomeField AS SPCall_SomeField
END
GO

CREATE PROCEDURE CheckHash(@HashValue INT, @data XML) AS
BEGIN
    SELECT  
        CHECKSUM(rt.value('@ID', 'int'), rt.value('@SomeField', 'varchar(255)')) AS Xml_CalculatedHashValue,
        @data Xml_Data,
        rt.value('@ID', 'int') AS Xml_ID,
        rt.value('@SomeField', 'varchar(255)') AS Xml_SomeField,
        @HashValue AS SPCall_HashValue

    FROM @data.nodes('xmlRowName') AS nd(rt)

END
GO

DECLARE @id INT = 11
DECLARE @SomeField varchar(255) = 'string value'
DECLARE @data XML

EXEC dbo.HashObject @id, @SomeField

SET @data = (SELECT @id AS ID, @SomeField AS SomeField FOR XML RAW('xmlRowName'))
EXEC dbo.CheckHash 0, @data

SET @data = (SELECT 25 AS ID, 'diferent string value' AS SomeField FOR XML RAW('xmlRowName'))
EXEC dbo.CheckHash 0, @data
GO  
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12688828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档