7

VARCHAR 値 (たとえば、'0x0000000002C490C8') を使用する ADO.NET ではなく、T-SQL 内で TIMESTAMP のパラメーター タイプを持つ MS SQL でストアド プロシージャを呼び出したいとします。

職業はなんですか?

更新: これは、「タイムスタンプ」値​​が表示される場所ですが、VARCHAR としてのみ存在します。(別のストアド プロシージャの OUTPUT 変数と考えてください。ただし、既に VARCHAR として固定されており、TIMESTAMP の値を持っているだけです)。では、動的 SQL を構築することを決定しない限り、VARCHAR に格納された値をプログラムで有効な TIMESTAMP に変更するにはどうすればよいでしょうか?

4

3 に答える 3

2

TIMESTAMP は意味的に VARBINARY(8) (null 可能) または BINARY(8) (null 不可) と同等です。したがって、次のように、パラメーターを引用符で囲まずにプロシージャを呼び出すことができるはずです。

EXEC usp_MyProc @myParam=0x0000000002C490C8

SQL オンライン ブックも参照してください。

更新された質問の編集...

いくつかの実験を試してみました。率直に言って、そもそもどのようにしてこれを varchar として表現したのか興味があります。

select top 10 convert(varchar, ts) from foo

ts はタイムスタンプで、10 行の空白行が表示されます。(変換しない場合は、タイムスタンプが表示されます。)

ただし、適切な方向から作業を試みました...私はこれを行いました:

select convert(timestamp, '0x0000000000170B2E')

そして変換の結果は0x3078303030303030. だからそれも再生されません。バイナリに変換することもありません。

言いたくないのですが、動的な SQL の世界に行き詰まっているかもしれません。しかし、私は本当に間違っていることを望んでいます。

于 2008-10-10T13:07:40.313 に答える
0

タイムスタンプ データ型は、SQL Server によって管理されます。テーブルの列タイプ以外で使用されているのを見たことがありません。その容量では、タイムスタンプ型の列は、データベース内の他のすべての更新に関連して、行の最後の挿入/更新の厳密な序数を提供します。データベース全体で最新の序数を表示するには、@@DBTS または rowversion() の値を取得できます。

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

タイムスタンプ (Transact-SQL)

は、データベース内で自動的に生成された一意の 2 進数を公開するデータ型です。通常、timestamp はテーブル行にバージョン スタンプを付けるメカニズムとして使用されます。ストレージサイズは 8 バイトです。タイムスタンプ データ型は単なる増分であり、日付や時刻は保持されません。日付または時刻を記録するには、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) への変換であり、タイムスタンプ型への変換ではありません。

詳細については (おそらく多すぎる)、コメント (4 番目の 1 つ下) を参照してください。 ?showComment=1213612020000

于 2008-10-20T22:53:48.457 に答える