I SQL Server kan du bruge TYPE_ID()
funktion til at returnere ID'et for en datatype baseret på dens navn. Dette kan være nyttigt, når du forespørger i en systemvisning, der gemmer en datatypes id, men ikke dens navn. Det er normalt nemmere at huske navnet. Ikke så let at huske ID.
Du kan bruge TYPE_ID()
for systemdatatyper og brugerdefinerede datatyper.
Eksempel 1 – Grundlæggende brug
Her er et grundlæggende eksempel for at demonstrere, hvordan det virker.
SELECT TYPE_ID('varchar') AS Result;
Resultat:
+----------+ | Result | |----------| | 167 | +----------+
Dette resultat fortæller os, at varchar datatypen har et ID på 167.
Eksempel 2 – Et databaseeksempel
Her er et eksempel på brug af TYPE_ID()
i en WHERE
klausul for at filtrere resultaterne til kun en given datatype.
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');
Resultat:
+---------------+---------------+-----------+-------------+ | 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 | +---------------+---------------+-----------+-------------+
Du vil bemærke, at jeg også bruger TYPE_NAME()
i dette eksempel for at returnere navnet baseret på dets ID.
Eksempel 3 – Brugerdefinerede typer
Du kan også bruge TYPE_ID()
for brugerdefinerede typer. Her er et eksempel, der inkluderer et brugerdefineret typealias i resultaterne.
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');
Resultat:
+---------------+---------------+-----------+-------------+-----------------+ | 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 | +---------------+---------------+-----------+-------------+-----------------+
Her er klientkodetypen et brugerdefineret typealias, og det er is_user_defined
flag er 1
. I dette tilfælde bruger jeg en CASE
udtryk for at returnere Yes
(og for at returnere No
hvis det er 0
).
Eksempel 4 – Ugyldig type eller utilstrækkelig tilladelse
Hvis du angiver et ugyldigt typenavn, eller du ikke har tilstrækkelig tilladelse til at referere til typen, vil resultatet være NULL.
SELECT TYPE_ID('oops') AS Result;
Resultat:
+----------+ | Result | |----------| | NULL | +----------+