Вопрос

Вы хотели бы вызвать сохраненный процесс в 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.Я бы действительно хотя мне нравится ошибаться.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top