SQL Serverでは、TYPE_NAME()
を使用できます IDに基づいてデータ型の名前を返す関数。これは、sys.columns
などのシステムビューをクエリするときに役立ちます。 タイプのIDは返しますが、名前は返しません。
TYPE_NAME()
を使用できます システムデータ型およびユーザー定義データ型の場合。
例1-基本的な使用法
これがどのように機能するかを示す基本的な例です。
SELECT TYPE_NAME(34) AS Result;
結果:
+----------+ | Result | |----------| | image | +----------+
この結果は、タイプID34が画像に使用されていることを示しています。 タイプ。
例2–より便利な例
より便利な例を次に示します。
USE Music; SELECT o.name AS [Object Name], c.name AS [Column Name], TYPE_NAME(c.user_type_id) AS [Type Name] FROM sys.objects AS o JOIN sys.columns AS c ON o.object_id = c.object_id WHERE o.type_desc = 'USER_TABLE';
結果:
+---------------+---------------+-------------+ | Object Name | Column Name | Type Name | |---------------+---------------+-------------| | Artists | ArtistId | int | | Artists | ArtistName | nvarchar | | Artists | ActiveFrom | date | | Artists | CountryId | int | | Genres | GenreId | int | | Genres | Genre | nvarchar | | Albums | AlbumId | int | | Albums | AlbumName | nvarchar | | Albums | ReleaseDate | date | | Albums | ArtistId | int | | Albums | GenreId | int | | Country | CountryId | int | | Country | CountryName | nvarchar | +---------------+---------------+-------------+
このクエリは、ユーザーテーブル、その列、および各列のデータ型を返します。
TYPE_NAME()
を削除すると次のようになります :
USE Music; SELECT o.name AS [Object Name], c.name AS [Column Name], c.user_type_id FROM sys.objects AS o JOIN sys.columns AS c ON o.object_id = c.object_id WHERE o.type_desc = 'USER_TABLE';
結果:
+---------------+---------------+----------------+ | Object Name | Column Name | user_type_id | |---------------+---------------+----------------| | Artists | ArtistId | 56 | | Artists | ArtistName | 231 | | Artists | ActiveFrom | 40 | | Artists | CountryId | 56 | | Genres | GenreId | 56 | | Genres | Genre | 231 | | Albums | AlbumId | 56 | | Albums | AlbumName | 231 | | Albums | ReleaseDate | 40 | | Albums | ArtistId | 56 | | Albums | GenreId | 56 | | Country | CountryId | 56 | | Country | CountryName | 231 | +---------------+---------------+----------------+
タイプIDを読み取るのは簡単ではありません。
例3–ユーザー定義タイプ
ユーザー定義のタイプが含まれています。結果にユーザー定義のタイプエイリアスを含める例を次に示します。
USE Test; SELECT o.name AS [Object Name], c.name AS [Column Name], TYPE_NAME(c.user_type_id) AS [Type Name], CASE WHEN t.is_user_defined = 1 THEN 'Yes' ELSE 'No' END AS [User Defined?] FROM sys.objects AS o JOIN sys.columns AS c ON o.object_id = c.object_id JOIN sys.types t ON c.user_type_id = t.user_type_id WHERE o.type_desc = 'USER_TABLE' AND o.name = 'Client';
結果:
+---------------+---------------+-------------+-----------------+ | Object Name | Column Name | Type Name | User Defined? | |---------------+---------------+-------------+-----------------| | Client | ClientCode | clientcode | Yes | | Client | FirstName | varchar | No | | Client | LastName | varchar | No | +---------------+---------------+-------------+-----------------+
例4– WHERE句でTYPE_NAME()を使用する
TYPE_NAME()
を使用できます (およびその他のシステム機能)WHERE
句(および式が許可されている場所)
ここでは、前の例を変更して、TYPE_NAME()
を使用します。 WHERE
で 条項。
USE Test; SELECT o.name AS [Object Name], c.name AS [Column Name], TYPE_NAME(c.user_type_id) AS [Type Name], CASE WHEN t.is_user_defined = 1 THEN 'Yes' ELSE 'No' END AS [User Defined?] FROM sys.objects AS o JOIN sys.columns AS c ON o.object_id = c.object_id JOIN sys.types t ON c.user_type_id = t.user_type_id WHERE TYPE_NAME(c.user_type_id) = 'clientcode';
結果:
+---------------+---------------+-------------+-----------------+ | Object Name | Column Name | Type Name | User Defined? | |---------------+---------------+-------------+-----------------| | Client | ClientCode | clientcode | Yes | +---------------+---------------+-------------+-----------------+
例5–無効なタイプIDまたは不十分な権限
無効なタイプIDを指定した場合、またはタイプを参照するための十分な権限がない場合、結果はNULLになります。
SELECT TYPE_NAME(258) AS Result;
結果:
+----------+ | Result | |----------| | NULL | +----------+
タイプIDを取得
データ型の名前はすでにわかっているが、そのIDが必要な場合は、TYPE_ID()
を使用できます。 名前に基づいてデータ型のIDを返します。