Я пытаюсь преобразовать поле 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 (®
На самом деле пробелы — это просто нулевые символы, которые завершают строку для выполнения динамического SQL с использованием EXEC()
.
DECLARE @sql VARCHAR(MAX) = 'SELECT TOP 1 ''test'' + CONVERT(VARCHAR(MAX), RowVersion) FROM MyTable'
EXEC (@sql)
Это просто отображает результат таблицы со словом «тест». Все после «теста» в динамическом SQL обрезается, потому что функция CONVERT
сначала возвращает завершающие нулевые символы.
Очевидно, что я хочу, чтобы результирующая строка была «test0x00000000288D17AE» или даже десятичным эквивалентом, который в данном случае будет «test680335278».
Любые идеи очень приветствуются.
rowversion
также нельзя использовать в качестве идентификатора, если вы думали, что можете использовать его как удобочитаемый ключ. - person Panagiotis Kanavos   schedule 07.12.2016binary(8)
, как иbigint
. Вы можете привести его к bigint, а затем использовать FORMAT, чтобы получить его шестнадцатеричное представление, напримерFORMAT(cast(RowVersion)as bigint),"x")
илиFORMAT(cast(cast(RowVersion as binary(8))as bigint),"x")
. Однако формат не будет заполнять строку нулями - person Panagiotis Kanavos   schedule 07.12.2016master.sys.fn_varbintohexstr
преобразует любое значение типаVARBINARY
в значениеNVARCHAR
. См. здесь некоторую информацию о том, как работает эта функция, а также исходный код. - person 3N1GM4   schedule 07.12.2016