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

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

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

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

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

谁能解释一下区别?

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

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

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

现在回答你的问题:

正如您现在肯定的那样,TIMESTAMP 是 - 除了 ANSI-SQL,它与 T-SQL 的 DATETIME 相同 - 二进制类型,最好与同义词ROWVERSION一起使用,以免混淆。

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)

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