W SQL Server możesz użyć TYPE_ID()
funkcja zwracająca identyfikator typu danych na podstawie jego nazwy. Może to być przydatne podczas wysyłania zapytań do widoku systemowego, który przechowuje identyfikator typu danych, ale nie jego nazwę. Zwykle łatwiej jest zapamiętać nazwę. Nie tak łatwo zapamiętać identyfikator.
Możesz użyć TYPE_ID()
dla typów danych systemowych i typów danych zdefiniowanych przez użytkownika.
Przykład 1 – Podstawowe użycie
Oto podstawowy przykład pokazujący, jak to działa.
SELECT TYPE_ID('varchar') AS Result;
Wynik:
+----------+ | Result | |----------| | 167 | +----------+
Ten wynik mówi nam, że varchar typ danych ma identyfikator 167.
Przykład 2 – Przykład bazy danych
Oto przykład użycia TYPE_ID()
w WHERE
klauzula, aby filtrować wyniki tylko do określonego typu danych.
SELECT o.name AS [Object Name], c.name AS [Column Name], c.user_type_id AS [Type ID], 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 JOIN sys.types t ON c.user_type_id = t.user_type_id WHERE c.user_type_id = TYPE_ID('varchar');
Wynik:
+---------------+---------------+-----------+-------------+ | Object Name | Column Name | Type ID | Type Name | |---------------+---------------+-----------+-------------| | Individual | FirstName | 167 | varchar | | Individual | LastName | 167 | varchar | | Occupation | JobTitle | 167 | varchar | | Event | EventName | 167 | varchar | | Scoreboard | Player | 167 | varchar | | Team | TeamName | 167 | varchar | | Client | FirstName | 167 | varchar | | Client | LastName | 167 | varchar | | Colors | ColorName | 167 | varchar | +---------------+---------------+-----------+-------------+
Zauważysz, że używam również TYPE_NAME()
w tym przykładzie, aby zwrócić nazwę na podstawie jej identyfikatora.
Przykład 3 – Typy zdefiniowane przez użytkownika
Możesz także użyć TYPE_ID()
dla typów zdefiniowanych przez użytkownika. Oto przykład, który zawiera alias typu zdefiniowanego przez użytkownika w wynikach.
SELECT o.name AS [Object Name], c.name AS [Column Name], c.user_type_id AS [Type ID], 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 c.user_type_id = TYPE_ID('varchar') OR c.user_type_id = TYPE_ID('clientcode');
Wynik:
+---------------+---------------+-----------+-------------+-----------------+ | Object Name | Column Name | Type ID | Type Name | User Defined? | |---------------+---------------+-----------+-------------+-----------------| | Individual | FirstName | 167 | varchar | No | | Individual | LastName | 167 | varchar | No | | Occupation | JobTitle | 167 | varchar | No | | Event | EventName | 167 | varchar | No | | Scoreboard | Player | 167 | varchar | No | | Team | TeamName | 167 | varchar | No | | Client | ClientCode | 257 | clientcode | Yes | | Client | FirstName | 167 | varchar | No | | Client | LastName | 167 | varchar | No | | Colors | ColorName | 167 | varchar | No | +---------------+---------------+-----------+-------------+-----------------+
Tutaj typ kodu klienta jest aliasem typu zdefiniowanym przez użytkownika i jest to is_user_defined
flaga to 1
. W tym przypadku używam CASE
wyrażenie do zwrócenia Yes
(i do zwrócenia No
jeśli jego 0
).
Przykład 4 – Nieprawidłowy typ lub niewystarczające uprawnienia
Jeśli podasz nieprawidłową nazwę typu lub nie masz wystarczających uprawnień do odwoływania się do typu, wynik będzie NULL.
SELECT TYPE_ID('oops') AS Result;
Wynik:
+----------+ | Result | |----------| | NULL | +----------+