1

我们已将数据库从 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>

任何人都可以解释其中的区别吗?

4

2 回答 2

3

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

于 2016-06-22T19:51:03.463 回答
1

首先:恭喜!没有 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)

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

于 2016-06-22T19:53:37.113 回答