我问这个问题,这导致我做了以下工作。
这意味着我可以将复杂的对象数据传递给SQLServer,并对哈希进行查找,而不是尝试将XML分解并与表进行匹配(我也可以这样做,但速度很慢(呃)).
然而,XML的优点之一是可以格式化它,例如缩进它等等,而且属性顺序也不重要。但是,当您散列某些内容时,格式化和缩进是很重要的。所以我在C#做的是..。
这很好,但是当我进行测试时,格式化XML就更容易了,这样我就可以更容易地看到我要传递给存储的proc的内容。
如果SQLServer可以被信任来保存属性顺序但它不能,那就太好了.
XML实例中的属性顺序没有保留。当查询存储在XML类型列中的xml实例时,结果XML中的属性顺序可能与原始XML实例不同。
这意味着我不能使用SQLServer的XML数据类型来规范数据。
困扰我的是,在某个时候,有人会使用我的过程,并认为“哦,好极了,XML,属性顺序不重要,格式化不重要,表示的数据是相同的”,然而,当我散列时,情况就不是这样了。
有人找到解决这个问题的办法了吗?我真的不想用T编写XML解析器!或者使用其他人编写的XML解析器来规范XML解析器。为什么SQLServer XML数据类型不能只保留属性顺序?
我想我可以“信任”我的应用程序总是以相同的格式/顺序传递XML,从而为同一个对象生成相同的散列。但是我不喜欢这样的想法,即存储的proc也必须“信任”应用程序才能做到这一点。我希望能够以某种方式检查XML的规范化,它显然会更加健壮。
发布于 2013-08-21 12:54:18
我将尝试序列化存储过程中的对象。
让我们来介绍以下课程:
class MyCustomObject
{
int id;
string SomeField;
}然后,您可以使用一个存储过程,在这个过程中,您用Xml序列化对象并计算输入参数的校验和,然后在另一个过程中,您可以传递一个HashValue(校验和)和一个xml。通过反序列化Xml可以计算Xml中字段的校验和,并将其与传递的HashValue进行比较。
试试下面的代码:(注意,您应该存储散列值,并将其返回给调用方,然后使用xml执行一些操作)
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 https://stackoverflow.com/questions/12688828
复制相似问题