SQL Server 2000 和 SQL Server 2014 在使用 for xml 显式返回结果时返回的不同值

Different values returned by SQL Server 2000 and SQL Server 2014 when returning results using for xml explicit

提问人:Neil Allen 提问时间:6/23/2016 最后编辑:ShnugoNeil Allen 更新时间:6/23/2016 访问量:94

问:

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

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

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

谁能解释一下其中的区别?

sql-server for-xml-explicit select-for-xml

评论


答:

3赞 krish 6/23/2016 #1

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

评论

1赞 Neil Allen 6/24/2016
优秀的答案,非常感谢。指向“Microsoft SQL Server 2005 中 FOR XML 的新增功能”的链接简明扼要地解释了该问题。虽然,相当尴尬的是,当我在 SQL Server 2014 中搜索重大更改时,我发现不合适。
1赞 Shnugo 6/23/2016 #2

首先:恭喜!没有 SQL Server 2000,您会很高兴的!

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

现在来回答你的问题:

正如您现在所肯定的那样,除了 ANSI-SQL(它与 T-SQL 相同)之外,它是一种二进制类型,最好与同义词一起使用以避免混淆。TIMESTAMPDATETIMEROWVERSION

SQL Server 2014SQL Server 2014SQL Server 2014SQL Server 2014SQL Server 2014SQL Server 2014SQL Server 2014SQL Server 2014SQL Server 2014SQL Server 2014SQL Server 2014SQL Server 2014SQL Server 2014SQL Server 2014SQL Server 2014SQL Server 2014SQL Server

试试这个:

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)

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

评论

1赞 Neil Allen 6/24/2016
非常感谢您的详细回答和示例。我们的应用程序使用了 SELECT ...在 .NET Framework 1.0 版(或大约)的几天内,当 DataSet 类和 ADO.NET 没有为我们提供太多有关 O/R 映射的帮助时,XML 显式。从那时起,我们饶有兴趣地观察并调侃了实体框架的各种版本,但没有足够的吸引力来使用它。但是,随着迁移到 SQL Server 2014,也许我们会发现 EF7 是合适的。也就是说,我喜欢 XML,尽管我觉得这样说有点老套。我同意你对SELECT的评论。FOR XML PATH('xyz')。
1赞 Neil Allen 6/24/2016
最终,我能够插入一个粗略的填充码,并使用 Convert.FromBase64String() 获取字节数组,并使用 BitConverter.ToUInt64() 获取与旧 SQL Server 2000 源 XML 相同的数据