Как конвертировать VARCHAR в TIMESTAMP в MSSQL? - PullRequest
5 голосов
/ 10 октября 2008

Вы хотите вызвать хранимый процесс в MS SQL, который имеет тип параметра TIMESTAMP в T-SQL, а не ADO.NET, используя значение VARCHAR (например, '0x0000000002C490C8').

Что ты делаешь?

UPDATE: Здесь у вас есть значение «Timestamp», которое существует только как VARCHAR. (Подумайте о переменной OUTPUT в другом хранимом процессе, но она уже зафиксирована как VARCHAR, она просто имеет значение TIMESTAMP). Итак, если вы не решите построить динамический SQL, как вы можете программно изменить значение, хранящееся в VARCHAR, в действительный TIMESTAMP?

Ответы [ 3 ]

4 голосов
/ 29 ноября 2011

Поскольку метка времени совместима с 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);

Reference. Блоги MSN

2 голосов
/ 10 октября 2008

TIMESTAMP семантически эквивалентен 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. Хотя я бы действительно хотел бы ошибаться.

0 голосов
/ 21 октября 2008

Тип данных временной метки управляется SQL Server. Я никогда не видел, чтобы он использовался где-либо, кроме как в качестве типа столбца таблицы. В этом качестве столбец типа timestamp предоставит вам строгий порядковый номер последней вставки / обновления в строке относительно всех других обновлений в базе данных. Чтобы увидеть самый последний порядковый номер во всей базе данных, вы можете получить значение @@ DBTS или rowversion ().

за http://msdn.microsoft.com/en-us/library/ms182776(SQL.90).aspx

отметка времени (Transact-SQL)

- это тип данных, который предоставляет автоматически генерируемые уникальные двоичные числа в базе данных. временная метка обычно используется в качестве механизма для строк таблицы версий. Размер хранилища составляет 8 байт. Тип данных отметки времени - просто увеличивающееся число и не сохраняет дату или время. Для записи даты или времени используйте тип данных datetime.

Следовательно, изменчивое значение столбца метки времени не может быть установлено и может изменяться при любом изменении строки. Однако вы можете зафиксировать значение временной метки в значении varbinary (8).

Например, скажем, у вас есть исходная таблица и целевая таблица.

CREATE TABLE tblSource ( <br/> Id int not null <br/> colData int not null <br/> colTimestamp timestamp null)</p> <p>CREATE TABLE tblTarget ( <br/> Id int not null <br/> colData int not null <br/> colTimestampVarBinary varbinary(8) null)

Затем в процессе извлечения может потребоваться захватить все, что было обновлено с момента последнего запуска процесса извлечения.

DECLARE @maxFrozenTargetTimestamp varchar(8) <br/>SELECT @maxFrozenTargetTimestamp = max(colStamp) FROM tblTarget <br/> <br/>INSERT tblTarget(Id, colData, colTimestampVarBinary) <br/>SELECT <br/> Id <br/> ,colData <br/>, colTimestampVarBinary = convert(varbinary(8) colTimestamp) <br/>FROM <br/> tblSource <br/>WHERE <br/> tblSource.colTimestamp > @maxFrozenTargetTimestamp

Если у вас возникли проблемы, я думаю, что суть вашей проблемы находится в преобразовании varchar в varbinary (8), а не в тип метки времени.

Для получения дополнительной информации (возможно, слишком много) см. Комментарий (четвертый внизу), который я оставил для записи в блоге http://vadivel.blogspot.com/2004/10/about-timestamp-datatype-of-sql-server.html?showComment=1213612020000

...