在大型XML集上使用HASHBYTES

时间:2016-08-28 15:25:56

标签: sql sql-server

我正在使用SQL Broker& SQL CLR将大量XML推送到我的企业服务总线(ESB),供消费者接听和处理。为了"审计" OUTGOING XML(我匹配)与服务总线的XML RECEIVED(通过将两者保存到表中)。

保存大量的XML很容易......没有问题。但是当我在LARGE XML值上使用HASHBYTES时,我收到以下错误:

  • 字符串或二进制数据将被截断。

...奇怪

  • 转换为VACHAR(MAX)不是问题
  • 使用HASHBYTES失败

目标:
我需要HASH值或将它们缩减为CHECKSUM,以便轻松验证它们。

因此,我如何将这些大的XML值哈希或减少为一个(小)值,这可以很容易地和视觉验证?

SAMPLE TESTER:
在这个问题中插入LARGE XML会太麻烦,所以我要包含一个复制问题的迷你脚本:

DECLARE @ContextCount INT = 1000;

----------------
---- Build the LARGE XML
----------------
DECLARE @Count INT = 1;
DECLARE @Xml NVARCHAR(MAX) = '<Contexts>';
WHILE (@Count <= @ContextCount)
BEGIN
    SET @Xml = @Xml + '<Context><Name>SomeTableName</Name><Key><SomeColumnName>' + CONVERT(VARCHAR(10), @Count) + '</SomeColumnName></Key></Context>'
    SET @Count = @Count + 1
END
SET @Xml = @Xml + '</Contexts>'

----------------
---- Build the LARGE XML
----------------

-- THIS WORKS
SELECT CONVERT(VARCHAR(MAX), @Xml)

-- THIS FAILS
SELECT HASHBYTES('MD5', CONVERT(VARCHAR(MAX), @Xml));

1 个答案:

答案 0 :(得分:2)

HASBYTE接受VARCHAR但不接受VARCHAR(MAX),因此会截断数据,并且可能会引发截断错误。如果您的数据超过8000字节,则可能需要创建自己的函数,https://dba.stackexchange.com/questions/10132/has-somebody-got-a-function-that-will-extend-hashbytes-to-strings-of-arbitrary-l