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

SQL Serverのテーブルまたはビューの列情報を取得する(T-SQL:sp_columns)

    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
    

    1. Oracleデータベースでは、ROWNUMとROW_NUMBERの違いは何ですか?

    2. CRYPT_GEN_RANDOM()を使用して、SQLServerで暗号化されたランダム番号を作成します

    3. postgresqlはギャップのないシーケンスを生成します

    4. Microsoft SQL Serverによるアクセス–SSISを使用した大規模なデータセットのインポート