SQL Serverでは、OBJECTPROPERTY()
に遭遇した可能性があります 関数、OBJECTPROPERTYEX()
もあることを確認するためだけに まったく同じことをしているように見える関数。
何が起きてる?同じことを行う2つの関数が必要なのはなぜですか?
私の理解では、MicrosoftはOBJECTPROPERTYEX()
を追加することを選択しました OBJECTPROPERTY()
の機能を拡張する 、OBJECTPROPERTY()
に変更を導入するのではなく これにより、レガシーシステム上の既存のコードが破損する可能性があります。
したがって、いくつかがあります 2つの機能の違い。
何が違うの?
一言で言えば、OBJECTPROPERTYEX()
6つの追加プロパティをサポートし、その戻りタイプは異なります。
内訳は次のとおりです。
OBJECTPROPERTY() | OBJECTPROPERTYEX() | |
---|---|---|
リターンタイプ | int | sql_variant |
サポートされているプロパティの数 | 103 | 109 |
追加のプロパティ |
| |
サポートされているプロパティ |
|
|
追加プロパティの例
これらの追加のプロパティが使用されていることを示す例を次に示します。
USE WideWorldImportersDW; DECLARE @objectId int = OBJECT_ID(N'Integration.GenerateDateDimensionColumns'); SELECT OBJECTPROPERTYEX(@objectId, 'BaseType') AS BaseType, OBJECTPROPERTYEX(@objectId, 'IsPrecise') AS IsPrecise, OBJECTPROPERTYEX(@objectId, 'SystemDataAccess') AS SystemDataAccess, OBJECTPROPERTYEX(@objectId, 'TableFullTextSemanticExtraction') AS TableFullTextSemanticExtraction, OBJECTPROPERTYEX(@objectId, 'UserDataAccess') AS UserDataAccess, OBJECTPROPERTYEX(@objectId, 'Cardinality') AS Cardinality;
結果(垂直出力を使用):
BaseType | IF IsPrecise | 0 SystemDataAccess | 1 TableFullTextSemanticExtraction | 0 UserDataAccess | 1 Cardinality | NULL
この場合、オブジェクトはテーブル値関数であり、6つのプロパティのうち5つのデータを返します。
次に、代わりにテーブルの名前を渡して、カーディナリティの値を取得できるかどうかを確認しましょう。
USE WideWorldImportersDW; DECLARE @objectId int = OBJECT_ID(N'Dimension.City'); SELECT OBJECTPROPERTYEX(@objectId, 'BaseType') AS BaseType, OBJECTPROPERTYEX(@objectId, 'IsPrecise') AS IsPrecise, OBJECTPROPERTYEX(@objectId, 'SystemDataAccess') AS SystemDataAccess, OBJECTPROPERTYEX(@objectId, 'TableFullTextSemanticExtraction') AS TableFullTextSemanticExtraction, OBJECTPROPERTYEX(@objectId, 'UserDataAccess') AS UserDataAccess, OBJECTPROPERTYEX(@objectId, 'Cardinality') AS Cardinality;
結果(垂直出力を使用):
BaseType | U IsPrecise | NULL SystemDataAccess | NULL TableFullTextSemanticExtraction | 0 UserDataAccess | NULL Cardinality | 116295
今回は、3つのプロパティでNULLを取得しますが、Cardinalityプロパティの値を取得します。