提问人:Neil Allen 提问时间:6/23/2016 最后编辑:ShnugoNeil Allen 更新时间:6/23/2016 访问量:94
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
问:
我们已将数据库从 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 2005 中的时间戳值序列化为 base64 编码的二进制值,而不是 SQL Server 2000 中的数字表示形式,您可以参考此链接了解在 SQL Server 2005 中对 XML 所做的所有更改
评论
首先:恭喜!没有 SQL Server 2000,您会很高兴的!
第二种:已过时,应(在几乎所有情况下)替换为 的调用。这为您提供了更好的控制和非常直观的方法。SELECT ... FOR XML EXPLICIT
SELECT ... FOR XML PATH('xyz')
现在来回答你的问题:
正如您现在所肯定的那样,除了 ANSI-SQL(它与 T-SQL 相同)之外,它是一种二进制类型,最好与同义词一起使用以避免混淆。TIMESTAMP
DATETIME
ROWVERSION
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)
你会得到这个号码 - 如果你需要它......
评论