Я пытаюсь преобразовать поле TIMESTAMP в таблицу в строку, чтобы ее можно было распечатать или выполнить как часть динамического SQL. SSMS может это сделать, поэтому для этого должен быть встроенный метод. Однако я не могу заставить его работать с использованием T-SQL.Как преобразовать значения TIMESTAMP в VARCHAR в T-SQL, как SSMS?
Следующая правильно отображает результат таблицы:
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».
Любые идеи были бы весьма признательны.
SSMS не делает любое такое преобразование. Он отображает данные в сетке так же, как * любое * другое приложение .NET. Двоичные значения обычно отображаются как hex или Base64. Почему вы хотите преобразовать двоичное значение в строку? Почему бы не передать его как есть или использовать его в качестве параметра? BTW 'rowversion' также не может использоваться в качестве идентификатора, если вы считаете, что можете использовать его как читаемый человеком ключ –
[rowversion] (https://msdn.microsoft.com/en-us/library/ms182776 .aspx) является «двоичным (8)» значением, как «bigint». Вы можете передать его в bigint, затем использовать [FORMAT] (https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k (format_TSQL); k (sql13.swb.tsqlresults.f1); к (sql13.swb.tsqlquery.f1); k (MiscellaneousFilesProject); k (DevLang-TSQL) & rd = true), чтобы получить его шестнадцатеричное представление, например 'FORMAT (cast (RowVersion) как bigint)," x ")' или 'FORMAT (литье (литье (RowVersion) как бинарный (8)) как bigint), «x») '. Формат не будет содержать строку с нулями, хотя –
Хотя это недокументировано, я считаю, что 'master.sys.fn_varbintohexstr' преобразует любое значение типа VARBINARY в значение« NVARCHAR ». См. [Здесь] (http://www.sqlservercentral.com/Forums/FindPost1708985.aspx) для получения дополнительной информации о том, как эта функция работает вместе с исходным кодом. – 3N1GM4