Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » SQL のダイアレクトと互換性 » SQL ダイアレクト » Transact-SQL との互換性を意識したデータベースの設定

 

Transact-SQL の特殊な timestamp カラムとデータ型

SQL Anywhere は Transact-SQL の特殊な timestamp カラムをサポートします。timestamp カラムは、tsequal システム関数とともに、ローが更新されたかどうかチェックするのに使用されます。

timestamp の 2 つの意味

SQL Anywhere は正確な日付と時間の情報を持つ TIMESTAMP データ型を持っています。これは、Transact-SQL の特殊な TIMESTAMP カラムとデータ型とは異なります。

SQL Anywhere での Transact-SQL の timestamp カラムの作成

Transact-SQL の timestamp カラムを作成するには、(SQL Anywhere の) TIMESTAMP データ型と timestamp のデフォルト設定値を持つカラムを作成します。このカラムにはどのような名前も付けられますが、通常は timestamp が使われます。

次に、Transact-SQL timestamp カラムを含む CREATE TABLE 文の例を示します

CREATE TABLE tablename (
   column_1 INTEGER,
   column_2 TIMESTAMP DEFAULT TIMESTAMP
);

次の ALTER TABLE 文は、SalesOrders テーブルに Transact-SQL timestamp カラムを追加します。

ALTER TABLE SalesOrders
ADD timestamp TIMESTAMP DEFAULT TIMESTAMP;

Adaptive Server Enterprise ではカラム名が timestamp で、データ型の指定がなければ自動的に TIMESTAMP データ型が与えられます。SQL Anywhere ではデータ型は自分で指定します。

timestamp カラムのデータ型

Adaptive Server Enterprise では、timestamp カラムはドメインの NULL を許容する VARBINARY(8) として扱われます。SQL Anywhere では、timestamp カラムは日付と時間からなる TIMESTAMP データ型として扱われ、時間は秒以下小数点 6 桁からなります。

後で更新するためにテーブルからフェッチするときは、timestamp 値がフェッチされる先の変数は、カラムの記述に従わなければなりません。

Interactive SQL では、ローの値の違いを調べるために timestamp_format オプションを設定することが必要な場合があります。次の文は、秒の小数点以下 6 桁すべてを表示するように timestamp_format オプションを設定します。

SET OPTION timestamp_format='YYYY-MM-DD HH:NN:SS.SSSSSS';

小数点以下 6 桁の数字すべてが表示されなければ、timestamp カラムの値は等しいように見えても、実際は等しくないことがあります。

更新時の tsequal の使用

tsequal システム関数を使えば、timestamp カラムが更新されたかどうかがわかります。

たとえば、アプリケーションが timestamp カラムを変数に SELECT したとします。選択されたロー内の 1 つの UPDATE が送信されたときに、アプリケーションは tsequal 関数を使用してそのローが修正されたかどうかをチェックできます。tsequal 関数は、テーブルの timestamp 値を SELECT で取得した timestamp 値と比較します。これらの値が同じなら、変更はありません。値が違う場合は、ローが SELECT の実行以降に変更されています。

tsequal 関数を使用する UPDATE 文の一般的な例を次に示します。

UPDATE publishers
SET City = 'Springfield'
WHERE pub_id = '0736'
AND TSEQUAL(timestamp, '2005/10/25 11:08:34.173226');

tsequal 関数の最初の引数は、特殊な timestamp カラムの名前です。2 番目の引数は SELECT 文で取得した timestamp です。Embedded SQL では、2 番目の引数は、カラムで最後に FETCH から取得した TIMESTAMP を含むホスト変数であることが多くなります。