【发布时间】:2016-12-07 10:05:30
【问题描述】:
我正在尝试将表中的 TIMESTAMP 字段转换为字符串,以便可以将其作为动态 SQL 的一部分打印或执行。 SSMS 是能够做到的,所以必须有一个内置的方法来做到这一点。但是,我无法使用 T-SQL 让它工作。
以下正确显示表格结果:
SELECT TOP 1 RowVersion FROM MyTable
它显示0x00000000288D17AE。但是,我需要将结果作为更大字符串的一部分。
DECLARE @res VARCHAR(MAX) = (SELECT TOP 1 'test' + CONVERT(BINARY(8), RowVersion) FROM MyTable)
PRINT(@res)
这会产生一个错误:The data types varchar and binary are incompatible in the add operator
DECLARE @res VARCHAR(MAX) = (SELECT TOP 1 'test' + CONVERT(VARCHAR(MAX), RowVersion) FROM MyTable)
PRINT(@res)
这会产生乱码:test (®
实际上,空格只是空字符并终止字符串,以便使用EXEC()运行动态SQL。
DECLARE @sql VARCHAR(MAX) = 'SELECT TOP 1 ''test'' + CONVERT(VARCHAR(MAX), RowVersion) FROM MyTable'
EXEC (@sql)
这只是显示带有单词“test”的表格结果。因为CONVERT函数首先返回终止空字符,所以动态SQL中“test”之后的所有内容都被截断了。
显然,我希望得到的字符串是“test0x00000000288D17AE”,甚至是十进制等值,在这种情况下是“test680335278”。
任何想法将不胜感激。
【问题讨论】:
-
SSMS 不进行任何此类转换。它像 任何 其他 .NET 应用程序一样在网格中显示数据。二进制值通常显示为十六进制或 Base64。为什么要将二进制值转换为字符串?为什么不按原样传递,或者将其用作参数? BTW
rowversion也不能用作标识符,如果您认为可以将其用作人类可读的键 -
rowversion 是一个
binary(8)值,就像bigint一样。您可以将其转换为 bigint,然后使用FORMAT 来获取其十六进制表示,例如FORMAT(cast(RowVersion)as bigint),"x")或FORMAT(cast(cast(RowVersion as binary(8))as bigint),"x")。格式不会用零填充字符串 -
虽然没有记录,但我相信
master.sys.fn_varbintohexstr会将任何VARBINARY类型值转换为NVARCHAR值。请参阅here 了解有关此功能如何工作的一些信息以及源代码。
标签: sql-server tsql ssms nvarchar sql-timestamp