SQL Serverでは、sp_special_columns
を使用できます テーブルの一意の識別子を識別するためのシステムストアドプロシージャ。具体的には、テーブル内の行を一意に識別する最適な列のセットを返します。また、行の値がトランザクションによって更新されたときに自動的に更新された列を返します。
sp_special_columns
ODBCのSQLSpecialColumnsと同等です。
テーブルを一意に識別できる列がない場合、結果セットは空です。
構文
構文は次のようになります:
sp_special_columns [ @table_name = ] 'table_name' [ , [ @table_owner = ] 'table_owner' ] [ , [ @qualifier = ] 'qualifier' ] [ , [ @col_type = ] 'col_type' ] [ , [ @scope = ] 'scope' ] [ , [ @nullable = ] 'nullable' ] [ , [ @ODBCVer = ] 'ODBCVer' ] [ ; ]
@table_name
引数が必要です。その他はオプションです。各引数の詳細な説明については、Microsoftのドキュメントを参照してください。
例1-主キー列
これは、 PersonId という主キー列を持つテーブルに対する基本的な例です。 :
EXEC sp_special_columns Person;
次のように実行することもできます:
EXEC sp_special_columns @table_name = 'Person';
結果:
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ | SCOPE | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | PSEUDO_COLUMN | |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------| | 1 | PersonId | 4 | int | 10 | 4 | 0 | 1 | +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
この場合、主キー列が返されます。次のコードでテーブルを作成したので、これが主キー列であることがわかります。
CREATE TABLE Person ( PersonId int primary key, PersonName varchar(500) );
したがって、ストアドプロシージャは、実際には、このテーブルを一意に識別する最適な列を返したようです。
例2–UNIQUE列
この例のテーブルには主キーはありませんが、UNIQUE
はあります。 制約。
テーブルの作成に使用されるコードは次のとおりです。
CREATE TABLE Event ( EventId int UNIQUE, EventName varchar(500) );
それでは、sp_special_columns
を実行してみましょう。 そのテーブルに対して:
EXEC sp_special_columns Event;
結果:
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ | SCOPE | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | PSEUDO_COLUMN | |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------| | 1 | EventId | 4 | int | 10 | 4 | 0 | 1 | +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
この場合、UNIQUE
の列 制約は最適な一意の識別子と見なされます。
ただし、これは必ずしもを意味するわけではありません UNIQUE
によって制約された列 制約は自動的に一意の識別子として認定されます。結果は、null値の処理方法によって異なります。
例3–@nullable引数
@nullable
を使用できます 特殊列がNULL値を受け入れることができるかどうかを指定する引数。
ここでは、同じコードを再度実行しますが、今回は@nullable = 'O'
を使用します。 。
EXEC sp_special_columns Event, @nullable = 'O';
結果:
(0 rows affected)
ここでは、@nullable = 'U'
を使用しています。
EXEC sp_special_columns Event, @nullable = 'U';
結果:
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ | SCOPE | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | PSEUDO_COLUMN | |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------| | 1 | EventId | 4 | int | 10 | 4 | 0 | 1 | +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
O
null値を許可しない特別な列を指定します。 U
部分的にNULL可能である列を指定します。 U
デフォルト値です。
列をNOT NULL
として作成するとどうなりますか。 :
DROP TABLE Event; CREATE TABLE Event ( EventId int NOT NULL UNIQUE, EventName varchar(500) ); EXEC sp_special_columns Event, @nullable = 'U'; EXEC sp_special_columns Event, @nullable = 'O';
結果:
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ | SCOPE | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | PSEUDO_COLUMN | |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------| | 1 | EventId | 4 | int | 10 | 4 | 0 | 1 | +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ (1 row affected) +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ | SCOPE | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | PSEUDO_COLUMN | |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------| | 1 | EventId | 4 | int | 10 | 4 | 0 | 1 | +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ (1 row affected)
今回は両方のO
およびU
同じ結果が得られました。
複数のUNIQUE
を持つテーブルがある場合 制約列、およびnull値を許可するものと許可しないものがありますが、この引数は、最適な一意の識別子と見なされるものに影響を与える可能性があります。私が言っていることの例については、この記事の下部にある例7を参照してください。
例4–IDENTITY列
この例のテーブルには、主キーまたはUNIQUE
がありません 制約がありますが、IDENTITY
があります 列。
テーブルの作成に使用されるコードは次のとおりです。
CREATE TABLE Product ( ProductId int IDENTITY, ProductName varchar(500) );
それでは、sp_special_columns
を実行してみましょう。 そのテーブルに対して:
EXEC sp_special_columns Product;
結果:
(0 rows affected)
つまり、IDENTITY
のようです このテーブルを一意に識別するには十分ではありません。
例5–複数列の主キー
これは、複数列の主キーを持つものです。この場合、主キーには2つの列が使用されます。
テーブルの作成に使用されるコードは次のとおりです。
CREATE TABLE PersonProduct ( PersonId int, ProductId int, CONSTRAINT PK_PersonProduct PRIMARY KEY (PersonId, ProductId) );
それでは、sp_special_columns
を実行してみましょう。 そのテーブルに対して:
EXEC sp_special_columns PersonProduct;
結果:
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ | SCOPE | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | PSEUDO_COLUMN | |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------| | 1 | PersonId | 4 | int | 10 | 4 | 0 | 1 | | 1 | ProductId | 4 | int | 10 | 4 | 0 | 1 | +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
例6–主キーと一意性制約
主キーがおよびある場合はどうなりますか UNIQUE
同じテーブルに制約がありますか?
調べてみましょう:
CREATE TABLE PersonEvent ( PersonEventId int UNIQUE, PersonId int, EventId int, CONSTRAINT PK_PersonEvent PRIMARY KEY (PersonId, EventId) );
sp_special_columns
を実行します そのテーブルに対して:
EXEC sp_special_columns PersonEvent;
結果:
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ | SCOPE | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | PSEUDO_COLUMN | |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------| | 1 | PersonId | 4 | int | 10 | 4 | 0 | 1 | | 1 | EventId | 4 | int | 10 | 4 | 0 | 1 | +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
主キーが勝ちました。
主キーとUNIQUE
を切り替えるとどうなりますか 周りの重要な列?
OK、そのためだけに別のテーブル全体を作成しましょう:
CREATE TABLE PersonEvent2 ( PersonEventId int PRIMARY KEY, PersonId int UNIQUE, EventId int UNIQUE );
sp_special_columns
を実行します そのテーブルに対して:
EXEC sp_special_columns PersonEvent2;
結果:
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ | SCOPE | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | PSEUDO_COLUMN | |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------| | 1 | PersonEventId | 4 | int | 10 | 4 | 0 | 1 | +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
そのため、主キーが再び勝ちました。
例7–多くの一意の制約
すべての場合はどうなりますか 列にUNIQUE
があります 制約?
CREATE TABLE Event2 ( EventId int UNIQUE, EventName varchar(500) UNIQUE, StartDate date UNIQUE, EndDate date UNIQUE );
sp_special_columns
を実行します そのテーブルに対して:
EXEC sp_special_columns Event2;
結果:
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ | SCOPE | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | PSEUDO_COLUMN | |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------| | 1 | EndDate | -9 | date | 10 | 20 | NULL | 1 | +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
しかし、これらの列の1つをNOT NULL
に設定するとどうなるか見てみましょう。 、次に@nullable = 'O'
を使用します :
DROP TABLE Event2; CREATE TABLE Event2 ( EventId int NOT NULL UNIQUE, EventName varchar(500) UNIQUE, StartDate date UNIQUE, EndDate date UNIQUE );
sp_special_columns
を実行します @nullable = 'O'
を使用 :
EXEC sp_special_columns Event2, @nullable = 'O';
結果:
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ | SCOPE | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | PSEUDO_COLUMN | |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------| | 1 | EventId | 4 | int | 10 | 4 | 0 | 1 | +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
そのため、「null許容ではない」列が最適な一意の識別子として選択されるようになりました。
それでは、sp_special_columns
を実行してみましょう。 @nullable = 'U'
を使用 :
EXEC sp_special_columns Event2, @nullable = 'U';
結果:
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ | SCOPE | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | PSEUDO_COLUMN | |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------| | 1 | EndDate | -9 | date | 10 | 20 | NULL | 1 | +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
前の列に戻ります。