【问题标题】:Different values returned by SQL Server 2000 and SQL Server 2014 when returning results using for xml explicit使用 for xml 显式返回结果时,SQL Server 2000 和 SQL Server 2014 返回的值不同
【发布时间】:2016-06-22 18:49:50
【问题描述】:

我们已将数据库从 SQL Server 2000 转换为 SQL Server 2014。我们需要 XML 输出并使用 T-SQL 的 for xml explicit 选项返回 XML。

时间戳值在转换过程中被保留。即常规查询返回两台服务器上的时间戳值0x00000000057A12B8

当显式使用 xml 时,SQL Server 2014 输出为<Ts>AAAAAAV6Erg=</Ts>,SQL Sever 2000 输出为<Ts>91886264</Ts>

谁能解释其中的区别?

【问题讨论】:

    标签: sql sql-server xml for-xml-explicit select-for-xml


    【解决方案1】:

    SQL Server 2005 中的时间戳值被序列化为 base64 编码的二进制值,而不是 SQL Server 2000 中的数字表示,您可以参考此link 了解 SQL Server 2005 中对 XML 所做的所有更改

    【讨论】:

    • 优秀的答案,非常感谢。指向“Microsoft SQL Server 2005 中 FOR XML 的新增功能”的链接简明地解释了该问题。虽然,相当尴尬的是,当我搜索 SQL Server 2014 中的重大更改时,我没有找到合适的。
    【解决方案2】:

    首先:恭喜!没有 SQL Server 2000 你会很开心!

    第二:SELECT ... FOR XML EXPLICIT 已过时,应该(在几乎所有情况下)替换为SELECT ... FOR XML PATH('xyz') 的调用。这为您提供了更好的控制和非常直观的方法。

    现在回答你的问题:

    正如你现在所确定的,TIMESTAMP 与 ANSI-SQL 不同,它与 T-SQL 的 DATETIME 相同 - 一个 二进制 类型,更好地与同义词 @987654325 一起使用@ 以避免混淆。

    SQL Server 2014 将将二进制数据隐式转换为 base64,以便您将其包含在 XML(基于文本)中。

    试试这个:

    DECLARE @varBin VARBINARY(MAX)=0x00000000057A12B8;
    DECLARE @asXML XML= (SELECT @varBin FOR XML PATH('xyz'));
    
    SELECT @asXML; 
    --result: <xyz>AAAAAAV6Erg=</xyz>
    
    --re-read the value
    SELECT @asXML.value('/xyz[1]','varbinary(max)')
    --result: 0x00000000057A12B8
    

    你得到的数值只是表示相同值的十进制数:

    HEX 57A12B8
    DEC 91.886.264
    BIN 0101 0111 1010 0001 0010 1011 1000
    

    有了这个查询

    SELECT CAST(@varBin AS BIGINT)
    

    你会得到这个号码 - 如果你需要它......

    【讨论】:

    • 非常感谢您的详细回答和示例。当 DataSet 类和 ADO.NET 在 O/R 映射方面没有为我们提供太多帮助时,我们的应用程序使用 SELECT ... FOR XML EXPLICIT 在 .NET Framework 1.0 版本(或大约版本)中。从那时起,我们就饶有兴趣地观察并研究了 Entity Framework 的各种版本,但没有足够的吸引力来使用它。但是,随着迁移到 SQL Server 2014,我们可能会发现 EF7 是合适的。也就是说,我喜欢 XML,虽然我觉得这样说有点过时。我同意您对 SELECT .. FOR XML PATH('xyz') 的评论。
    • 最终我能够插入一个粗垫片并使用 Convert.FromBase64String() 来获取一个字节数组,并使用 BitConverter.ToUInt64() 来获取与旧 SQL Server 2000 来源相同的形式的数据XML
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多