Использование SQL Server 2008 +.
У меня есть столбец rowversion (он же отметка времени), который я извлекаю из базы данных и преобразую в числовое значение (20,0), используя следующий код:
CONVERT(NUMERIC(20,0), RowVersionColumn + 0) AS [RowVersion]
Позже мне нужно взять это числовое значение (которое хранится в ADO.NET DataSet как ulong / UInt64) и преобразовать его обратно в тип данных rowversion.
Это создает проблемы, хотя. Кажется, что, хотя вы можете преобразовать в числовое значение (20,0), обратная операция не дает правильного значения. Например:
DECLARE @MyNumericValue NUMERIC(20,0)
DECLARE @MyRowVersionValue ROWVERSION
SET @MyNumericValue = 12345
SET @MyRowVersionValue = CONVERT(rowversion, @MyNumericValue)
PRINT CONVERT(NUMERIC(20,0), @MyRowVersionValue + 0)
Выполнение этого кода выводит значение 959447040, а не 12345. Удаление «+ 0» из оператора CONVERT приводит к правильному результату, но я все еще не могу надежно принять числовое значение, которое раньше было строкой и превратить его обратно в версию строки, значение которой должно быть таким.
Ниже приведена еще лучшая демонстрация этой проблемы:
DECLARE @MyNumericValue NUMERIC(20,0)
DECLARE @MyRowVersionValue ROWVERSION
DECLARE @MyRowVersionValue2 ROWVERSION
SET @MyRowVersionValue = @@DBTS
SET @MyNumericValue = CONVERT(NUMERIC(20,0), @MyRowVersionValue + 0)
SET @MyRowVersionValue2 = CONVERT(rowversion, @MyNumericValue)
SELECT @MyRowVersionValue
SELECT @MyNumericValue
SELECT @MyRowVersionValue2
Ваши результаты будут различаться в зависимости от ваших входных данных, но в качестве примера мой вывод был:
0x0000000003ADBB2F
61717295
0x140000012FBBAD03
Первое и последнее значения должны совпадать, но они не совпадают. Я предполагаю, что это как-то связано с тем фактом, что преобразования двоичных данных часто приводят к заполнению, и это изменение изменяет значение. См:
http://msdn.microsoft.com/en-us/library/aa223991(v=SQL.80).aspx
Мысли
РЕДАКТИРОВАТЬ: Чтобы уточнить, факт, что я имею дело с rowversion / timestamp, является случайным. Эта же проблема возникает с BINARY (8) вместо ROWVERSION, поскольку они являются эквивалентными типами данных.