W SQL Server możesz użyć TYPE_NAME()
funkcja zwracająca nazwę typu danych na podstawie jego identyfikatora. Może to być przydatne podczas wysyłania zapytań do widoku systemowego, takiego jak sys.columns
który zwraca identyfikator typu, ale nie jego nazwę.
Możesz użyć TYPE_NAME()
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_NAME(34) AS Result;
Wynik:
+----------+ | Result | |----------| | image | +----------+
Ten wynik mówi nam, że identyfikator typu 34 jest używany dla obrazu typ.
Przykład 2 – Bardziej użyteczny przykład
Oto bardziej przydatny przykład.
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';
Wynik:
+---------------+---------------+-------------+ | 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 | +---------------+---------------+-------------+
To zapytanie zwraca tabele użytkowników wraz z ich kolumnami i typem danych dla każdej kolumny.
Oto jak to wygląda, jeśli usunę 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';
Wynik:
+---------------+---------------+----------------+ | 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 | +---------------+---------------+----------------+
Nie jest tak łatwo odczytać identyfikator typu.
Przykład 3 – Typy zdefiniowane przez użytkownika
Uwzględniono typy zdefiniowane przez użytkownika. Oto przykład, który zawiera alias typu zdefiniowanego przez użytkownika w wynikach.
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';
Wynik:
+---------------+---------------+-------------+-----------------+ | Object Name | Column Name | Type Name | User Defined? | |---------------+---------------+-------------+-----------------| | Client | ClientCode | clientcode | Yes | | Client | FirstName | varchar | No | | Client | LastName | varchar | No | +---------------+---------------+-------------+-----------------+
Przykład 4 – Użycie TYPE_NAME() w klauzuli WHERE
Możesz użyć TYPE_NAME()
(i dowolną inną funkcję systemową) w WHERE
klauzula (i gdziekolwiek wyrażenie jest dozwolone).
Tutaj modyfikuję poprzedni przykład, aby użyć TYPE_NAME()
w WHERE
klauzula.
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';
Wynik:
+---------------+---------------+-------------+-----------------+ | Object Name | Column Name | Type Name | User Defined? | |---------------+---------------+-------------+-----------------| | Client | ClientCode | clientcode | Yes | +---------------+---------------+-------------+-----------------+
Przykład 5 – Nieprawidłowy identyfikator typu lub niewystarczające uprawnienia
Jeśli podasz nieprawidłowy identyfikator typu lub nie masz wystarczających uprawnień do odwoływania się do typu, wynikiem będzie NULL.
SELECT TYPE_NAME(258) AS Result;
Wynik:
+----------+ | Result | |----------| | NULL | +----------+
Pobierz identyfikator typu
Jeśli znasz już nazwę typu danych, ale chcesz jego identyfikator, możesz użyć TYPE_ID()
aby zwrócić identyfikator typu danych na podstawie jego nazwy.