代码之家  ›  专栏  ›  技术社区  ›  Prisoner ZERO

在大型XML集上使用HASHBYTES

  •  3
  • Prisoner ZERO  · 技术社区  · 9 年前

    SQL Broker & SQL CLR 推出大型 XML 发送到我的企业服务总线(ESB),供消费者提取和处理。为了“审计”OUTGOINGXML(我匹配它),使用服务总线接收的XML(通过将两者保存到表中)。

    保存大型XML集很容易……没有问题。但是,当我对LARGE XML值使用HASHBYTES时,我得到了以下错误:

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

    奇怪地

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

    目标:

    样品测试仪:
    在这个问题中插入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 回复  |  直到 9 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    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