Как преобразовать VARCHAR в TIMESTAMP в MSSQL?
-
08-07-2019 - |
Вопрос
Вы хотели бы вызвать сохраненный процесс в MS SQL, который имеет тип параметра TIMESTAMP в T-SQL, а не ADO.NET используя значение VARCHAR (например'0x0000000002C490C8').
Чем ты занимаешься?
Обновить:Это тот случай, когда вам приходит значение "Timestamp", но оно существует только как VARCHAR .(Подумайте о ВЫХОДНОЙ переменной в другом сохраненном процессе, но она уже исправлена как VARCHAR, она просто имеет значение МЕТКИ ВРЕМЕНИ).Итак, если вы не решите создать динамический SQL, как вы можете программно изменить значение, хранящееся в VARCHAR, на действительную временную МЕТКУ?
Решение
Тип данных метки времени управляется SQL Server.Я никогда не видел, чтобы он использовался где-либо, кроме как в качестве типа столбца таблицы.В этом качестве столбец типа timestamp предоставит вам строгий порядковый номер последней вставки / обновления в строке по отношению ко всем другим обновлениям в базе данных.Чтобы просмотреть самый последний порядковый номер во всей базе данных, вы можете получить значение @@DBTS или rowversion().
За http://msdn.microsoft.com/en-us/library/ms182776 (SQL.90).aspx
временная метка (Transact-SQL)
это тип данных, который предоставляет автоматически сгенерированные уникальные двоичные числа в базе данных.временная метка обычно используется в качестве механизма для отметки версий строк таблицы.Размер хранилища составляет 8 байт.Тип данных timestamp - это просто увеличивающееся число, которое не сохраняет дату или время.Чтобы записать дату или время, используйте тип данных datetime.
Следовательно, изменчивое значение столбца временной метки не может быть установлено и может быть изменено при любом изменении строки.Однако вы можете заморозить значение метки времени до значения varbinary(8).
Например, предположим, у вас была исходная таблица и целевая таблица.
CREATE TABLE tblSource (
Id int not null
colData int not null
colTimestamp timestamp null)
CREATE TABLE tblTarget (
Id int not null
colData int not null
colTimestampVarBinary varbinary(8) null)
Затем, в процессе извлечения, вы можете захотеть записать все, что было обновлено с момента последнего запуска процесса извлечения.
DECLARE @maxFrozenTargetTimestamp varchar(8)
SELECT @maxFrozenTargetTimestamp = max(colStamp) FROM tblTarget
INSERT tblTarget(Id, colData, colTimestampVarBinary)
SELECT
Id
,colData
, colTimestampVarBinary = convert(varbinary(8) colTimestamp)
FROM
tblSource
WHERE
tblSource.colTimestamp > @maxFrozenTargetTimestamp
Если у вас возникли проблемы, мое первое предположение было бы в том, что суть вашей проблемы заключается в преобразовании varchar в varbinary(8), а не в тип метки времени.
Для получения дополнительной информации (возможно, слишком большой) смотрите комментарий (четвертый внизу) Я перешел к сообщению в блоге http://vadivel.blogspot.com/2004/10/about-timestamp-datatype-of-sql-server.html?showComment=1213612020000
Другие советы
Поскольку timestamp совместим с varbinary, решение будет таким в SQL Server 2008:
declare @hexstring varchar(max);
set @hexstring = '0xabcedf012439';
select CONVERT(varbinary(max), @hexstring, 1);
set @hexstring = 'abcedf012439';
select CONVERT(varbinary(max), @hexstring, 2);
Ссылка. Блоги MSN
ВРЕМЕННАЯ МЕТКА семантически эквивалентна VARBINARY(8) (обнуляемому) или BINARY(8) (ненулевому).Таким образом, вы должны иметь возможность вызвать процедуру с параметром без кавычек следующим образом:
EXEC usp_MyProc @myParam=0x0000000002C490C8
Смотрите также Книги по SQL Онлайн
ОТРЕДАКТИРУЙТЕ обновленный вопрос ...
Я только что провел несколько экспериментов.Честно говоря, мне любопытно, как вы вообще представили это как varchar, поскольку, когда я делаю что-то вроде:
select top 10 convert(varchar, ts) from foo
Где ts - временная метка, я получаю 10 пустых строк.(Если я не конвертирую, я вижу свои временные метки.)
Тем не менее, я попытался работать над этим в правильном направлении ...Я сделал это:
select convert(timestamp, '0x0000000000170B2E')
И преобразование привело к 0x3078303030303030
.Так что это тоже не сработает.Также не произойдет преобразование в двоичный файл.
Мне неприятно это говорить, но вы, возможно, застряли в динамичном мире SQL.Я бы действительно хотя мне нравится ошибаться.