SQL Serverでは、sp_columns
を使用できます 現在の環境で照会できる指定されたオブジェクトの列情報を返すシステム・ストアード・プロシージャー。このようなオブジェクトには、テーブル、ビュー、またはテーブル値関数などの列を持つその他のオブジェクトが含まれます。
特定の列の情報を取得することも、特定のテーブルやビューなどからすべての列を指定することもできます。
構文
構文は次のようになります:
sp_columns [ @table_name = ] object [ , [ @table_owner = ] owner ] [ , [ @table_qualifier = ] qualifier ] [ , [ @column_name = ] column ] [ , [ @ODBCVer = ] ODBCVer ]
@table_name
引数は唯一の必須の引数です。これは、列情報が必要なテーブル/オブジェクトの名前です。
他の引数はオプションです。これらの引数の詳細については、Microsoftのドキュメントを参照してください。
このストアドプロシージャにはSELECT
が必要です およびVIEW DEFINITION
スキーマの権限。
例1-特定の列の情報を返す
この例では、考えられるすべての引数を使用しています。特定のデータベース内の特定のテーブル所有者から、特定のテーブル内の特定の列の情報を返します。
EXEC sp_columns @table_name = 'Cities', @table_owner = 'Application', @table_qualifier = 'WideWorldImporters', @column_name = 'Location', @ODBCVer = 2;
結果(垂直出力を使用):
TABLE_QUALIFIER | WideWorldImporters TABLE_OWNER | Application TABLE_NAME | Cities COLUMN_NAME | Location DATA_TYPE | -4 TYPE_NAME | geography PRECISION | 2147483647 LENGTH | 2147483647 SCALE | NULL RADIX | NULL NULLABLE | 1 REMARKS | NULL COLUMN_DEF | NULL SQL_DATA_TYPE | -4 SQL_DATETIME_SUB | NULL CHAR_OCTET_LENGTH | 2147483647 ORDINAL_POSITION | 4 IS_NULLABLE | YES SS_DATA_TYPE | 23 (1 row affected)
これを行うためのより簡潔な方法は次のとおりです。
EXEC sp_columns 'Cities', 'Application', 'WideWorldImporters', 'Location', 2;
同じ結果が返されます。
例2–テーブルのみを指定する
この例では、別のデータベースに切り替えて、テーブル名のみを指定します。
USE Music; EXEC sp_columns @table_name = 'Artists';
結果(垂直出力を使用):
Changed database context to 'Music'. -[ RECORD 1 ]------------------------- TABLE_QUALIFIER | Music TABLE_OWNER | dbo TABLE_NAME | Artists COLUMN_NAME | ArtistId DATA_TYPE | 4 TYPE_NAME | int identity PRECISION | 10 LENGTH | 4 SCALE | 0 RADIX | 10 NULLABLE | 0 REMARKS | NULL COLUMN_DEF | NULL SQL_DATA_TYPE | 4 SQL_DATETIME_SUB | NULL CHAR_OCTET_LENGTH | NULL ORDINAL_POSITION | 1 IS_NULLABLE | NO SS_DATA_TYPE | 56 -[ RECORD 2 ]------------------------- TABLE_QUALIFIER | Music TABLE_OWNER | dbo TABLE_NAME | Artists COLUMN_NAME | ArtistName DATA_TYPE | -9 TYPE_NAME | nvarchar PRECISION | 255 LENGTH | 510 SCALE | NULL RADIX | NULL NULLABLE | 0 REMARKS | NULL COLUMN_DEF | NULL SQL_DATA_TYPE | -9 SQL_DATETIME_SUB | NULL CHAR_OCTET_LENGTH | 510 ORDINAL_POSITION | 2 IS_NULLABLE | NO SS_DATA_TYPE | 39 -[ RECORD 3 ]------------------------- TABLE_QUALIFIER | Music TABLE_OWNER | dbo TABLE_NAME | Artists COLUMN_NAME | ActiveFrom DATA_TYPE | -9 TYPE_NAME | date PRECISION | 10 LENGTH | 20 SCALE | NULL RADIX | NULL NULLABLE | 1 REMARKS | NULL COLUMN_DEF | NULL SQL_DATA_TYPE | -9 SQL_DATETIME_SUB | NULL CHAR_OCTET_LENGTH | NULL ORDINAL_POSITION | 3 IS_NULLABLE | YES SS_DATA_TYPE | 0 (3 rows affected)
これにより、指定されたテーブルのすべての列の情報が返されます。
ただし、正しいデータベースに存在する必要があります。前の例を別のデータベースで再実行すると、結果が得られません。
USE WideWorldImporters; EXEC sp_columns @table_name = 'Artists';
結果:
Changed database context to 'WideWorldImporters'. (0 rows affected)
例3–テーブル修飾子について
@table_qualifier
を提供する場合 引数、それは現在のデータベースと同じでなければなりません。そうでない場合は、エラーが返されます。
USE Music; EXEC sp_columns @table_name = 'Artists', @table_qualifier = 'WideWorldImporters';
結果:
Msg 15250, Level 16, State 1, Line 24 The database name component of the object qualifier must be the name of the current database.
この例では、「Music」データベースに切り替えましたが、「WideWorldImporters」のテーブル修飾子を使用したため、エラーMsg15250が返されました。
この場合、「音楽」のテーブル修飾子を使用する必要がありました。あるいは、引数を完全に省略した可能性もあります。
例4–ビュー
オブジェクトタイプに関係なく、構文は同じです。ビューの列情報を取得する例は次のとおりです。
EXEC sp_columns @table_name = 'Customers', @table_owner = 'Website', @column_name = 'CustomerID';
結果:
TABLE_QUALIFIER | WideWorldImporters TABLE_OWNER | Website TABLE_NAME | Customers COLUMN_NAME | CustomerID DATA_TYPE | 4 TYPE_NAME | int PRECISION | 10 LENGTH | 4 SCALE | 0 RADIX | 10 NULLABLE | 0 REMARKS | NULL COLUMN_DEF | NULL SQL_DATA_TYPE | 4 SQL_DATETIME_SUB | NULL CHAR_OCTET_LENGTH | NULL ORDINAL_POSITION | 1 IS_NULLABLE | NO SS_DATA_TYPE | 56
それはたまたまビューの列情報です。
この場合、クエリからテーブル所有者を省略すると、2つの行が返されます。
EXEC sp_columns @table_name = 'Customers', @column_name = 'CustomerID';
結果:
-[ RECORD 1 ]------------------------- TABLE_QUALIFIER | WideWorldImporters TABLE_OWNER | Sales TABLE_NAME | Customers COLUMN_NAME | CustomerID DATA_TYPE | 4 TYPE_NAME | int PRECISION | 10 LENGTH | 4 SCALE | 0 RADIX | 10 NULLABLE | 0 REMARKS | NULL COLUMN_DEF | (NEXT VALUE FOR [Sequences].[CustomerID]) SQL_DATA_TYPE | 4 SQL_DATETIME_SUB | NULL CHAR_OCTET_LENGTH | NULL ORDINAL_POSITION | 1 IS_NULLABLE | NO SS_DATA_TYPE | 56 -[ RECORD 2 ]------------------------- TABLE_QUALIFIER | WideWorldImporters TABLE_OWNER | Website TABLE_NAME | Customers COLUMN_NAME | CustomerID DATA_TYPE | 4 TYPE_NAME | int PRECISION | 10 LENGTH | 4 SCALE | 0 RADIX | 10 NULLABLE | 0 REMARKS | NULL COLUMN_DEF | NULL SQL_DATA_TYPE | 4 SQL_DATETIME_SUB | NULL CHAR_OCTET_LENGTH | NULL ORDINAL_POSITION | 1 IS_NULLABLE | NO SS_DATA_TYPE | 56 (2 rows affected)
「Customers」と呼ばれるオブジェクトが2つあるため、2つの行が返されます。 1つはビューで、もう1つはテーブルです。ビューのテーブル所有者は「Webサイト」と呼ばれ、テーブルのテーブル所有者は「販売」と呼ばれます。
例5–テーブル値関数
前述のように、テーブル値関数の列情報を取得することもできます。
これは、テーブル値関数の列情報を取得する例です。繰り返しますが、構文は同じです。
EXEC sp_columns @table_name = 'DetermineCustomerAccess';
結果:
TABLE_QUALIFIER | WideWorldImporters TABLE_OWNER | Application TABLE_NAME | DetermineCustomerAccess COLUMN_NAME | AccessResult DATA_TYPE | 4 TYPE_NAME | int PRECISION | 10 LENGTH | 4 SCALE | 0 RADIX | 10 NULLABLE | 0 REMARKS | NULL COLUMN_DEF | NULL SQL_DATA_TYPE | 4 SQL_DATETIME_SUB | NULL CHAR_OCTET_LENGTH | NULL ORDINAL_POSITION | 1 IS_NULLABLE | NO SS_DATA_TYPE | 56