sql >> データベース >  >> RDS >> Sqlserver

OBJECTPROPERTY()を使用して、SQLServerのテーブルにTIMESTAMP列があるかどうかを確認します。

    OBJECTPROPERTY()を使用できます SQL Serverの関数を使用して、テーブルにタイムスタンプがあるかどうかを確認します。 桁。

    これを行うには、最初の引数としてテーブルのオブジェクトIDを渡し、TableHasTimestamp 2番目の引数として。この関数は1を返します または0 タイムスタンプがあるかどうかによって異なります 列。

    1の戻り値 テーブルが行うことを意味します タイムスタンプがある 列、および0の値 そうではないことを意味します。

    これは、行バージョンとして定義されている列でも機能します (タイムスタンプ rowversionの非推奨の同義語です )。

    例1-タイムスタンプ列

    タイムスタンプを使用してテーブルでデモンストレーションする簡単な例を次に示します。 列。

    USE Test_timestamp;
    SELECT OBJECTPROPERTY(OBJECT_ID('Pet'), 'TableHasTimestamp') AS [TableHasTimestamp];
    

    結果:

    +---------------------+
    | TableHasTimestamp   |
    |---------------------|
    | 1                   |
    +---------------------+
    

    この場合、 Test_timestamp データベースには、提供されたIDのテーブルがあり、タイムスタンプがあります。 列。

    OBJECT_ID()を使用します 名前に基づいてテーブルのIDを取得する関数。

    例2–行バージョン列

    前述のように、この方法は、行バージョンを使用した場合にも機能します。 列を定義します。

    たとえば、次のようにテーブルを作成するとします。

    CREATE TABLE Owner (
      OwnerId int PRIMARY KEY, 
      OwnerName varchar(255), 
      RowVersion rowversion
      );
    

    そして、それをチェックします:

    SELECT OBJECTPROPERTY(OBJECT_ID('Owner'), 'TableHasTimestamp') AS [TableHasTimestamp];
    

    結果:

    +---------------------+
    | TableHasTimestamp   |
    |---------------------|
    | 1                   |
    +---------------------+
    

    Microsoftのドキュメントには、タイムスタンプと記載されていますが、私は気づきました。 rowversionの同義語です 、この記事の執筆時点では、行バージョンとして列を作成しています 私のSQLServer2017システムでは、実際にはタイムスタンプとして表示されます。 桁。列が作成された後にタイプを見ると、タイムスタンプ列として表示されます。

    SELECT 
      OBJECT_NAME(object_id) AS [Table],
      name AS [Column],
      TYPE_NAME(system_type_id) AS [Type]
    FROM sys.columns
    WHERE OBJECT_NAME(object_id) = 'Owner';
    

    結果:

    +---------+------------+-----------+
    | Table   | Column     | Type      |
    |---------+------------+-----------|
    | Owner   | OwnerId    | int       |
    | Owner   | OwnerName  | varchar   |
    | Owner   | RowVersion | timestamp |
    +---------+------------+-----------+
    

    例3–TIMESTAMP列のないテーブル

    テーブルにタイムスタンプがない場合は、次のようになります。 列。

    USE WideWorldImportersDW;
    SELECT OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'TableHasTimestamp') AS [TableHasTimestamp];
    

    結果:

    +---------------------+
    | TableHasTimestamp   |
    |---------------------|
    | 0                   |
    +---------------------+
    

    この場合、オブジェクトはテーブルですが、タイムスタンプはありません。 列。

    例4–オブジェクトがテーブルではない場合

    データベースにIDを持つオブジェクトが含まれているが、そのオブジェクトがテーブルではない場合は、次のようになります。

    SELECT OBJECTPROPERTY(OBJECT_ID('Sequences.ReseedAllSequences'), 'TableHasTimestamp') AS [TableHasTimestamp];
    

    結果:

    +---------------------+
    | TableHasTimestamp   |
    |---------------------|
    | NULL                |
    +---------------------+
    

    例5–オブジェクトが存在しない

    SQL Serverは、オブジェクトIDが現在のデータベースコンテキストにあると想定します。別のデータベースからオブジェクトIDを渡すと、NULLの結果が得られるか、誤った結果が得られます。

    SELECT 
      OBJECTPROPERTY(OBJECT_ID('InvalidObject'), 'TableHasTimestamp') AS [InvalidObject],
      OBJECTPROPERTY(12345678, 'TableHasTimestamp') AS [12345678];
    

    結果:

    +-----------------+------------+
    | InvalidObject   | 12345678   |
    |-----------------+------------|
    | NULL            | NULL       |
    +-----------------+------------+
    

    この場合、データベースにはその名前またはIDのオブジェクトが含まれていないため、結果はNULLになります。

    エラーが発生した場合、またはオブジェクトを表示する権限がない場合にもNULLが発生します。


    1. MySQLのインストール-python

    2. MariaDBサーバーでのMyRocksストレージエンジンの使用

    3. SQLServer2016でのServiceBrokerの機能強化

    4. SQLServerのメッセージ8114「データ型varcharから数値への変換エラー」を修正しました