sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man returnerar en lista över datatyper i SQL Server (T-SQL)

Om du någonsin behöver få en lista över datatyper i SQL Server kan du använda en av systemvyerna för att göra just det.

I synnerhet kan du använda sys.types systemkatalogvy. Denna vy returnerar alla systemlevererade och användardefinierade datatyper definierade i databasen. Om du använder SQL Server 2000 sys.systypes borde göra susen.

Exempel 1 – sys.types Visa

sys.types view är den bästa att använda om du använder en version av SQL Server senare än SQL Server 2000.

Det snabbaste/enklaste sättet att använda sys.types synen är att välja allt. I så fall kan din kod se ut så här:

SELECT * FROM sys.types;

Detta returnerar dock många kolumner som du kanske eller kanske inte är intresserad av. Du kan begränsa det till bara de kolumner som du är intresserad av.

Här är ett exempel på hur du väljer några kolumner av intresse:

SELECT 
  name,
  max_length,
  [precision],
  scale,
  is_user_defined
FROM sys.types;

Resultat:

+------------------+--------------+-------------+---------+-------------------+
| name             | max_length   | precision   | scale   | is_user_defined   |
|------------------+--------------+-------------+---------+-------------------|
| image            | 16           | 0           | 0       | 0                 |
| text             | 16           | 0           | 0       | 0                 |
| uniqueidentifier | 16           | 0           | 0       | 0                 |
| date             | 3            | 10          | 0       | 0                 |
| time             | 5            | 16          | 7       | 0                 |
| datetime2        | 8            | 27          | 7       | 0                 |
| datetimeoffset   | 10           | 34          | 7       | 0                 |
| tinyint          | 1            | 3           | 0       | 0                 |
| smallint         | 2            | 5           | 0       | 0                 |
| int              | 4            | 10          | 0       | 0                 |
| smalldatetime    | 4            | 16          | 0       | 0                 |
| real             | 4            | 24          | 0       | 0                 |
| money            | 8            | 19          | 4       | 0                 |
| datetime         | 8            | 23          | 3       | 0                 |
| float            | 8            | 53          | 0       | 0                 |
| sql_variant      | 8016         | 0           | 0       | 0                 |
| ntext            | 16           | 0           | 0       | 0                 |
| bit              | 1            | 1           | 0       | 0                 |
| decimal          | 17           | 38          | 38      | 0                 |
| numeric          | 17           | 38          | 38      | 0                 |
| smallmoney       | 4            | 10          | 4       | 0                 |
| bigint           | 8            | 19          | 0       | 0                 |
| hierarchyid      | 892          | 0           | 0       | 0                 |
| geometry         | -1           | 0           | 0       | 0                 |
| geography        | -1           | 0           | 0       | 0                 |
| varbinary        | 8000         | 0           | 0       | 0                 |
| varchar          | 8000         | 0           | 0       | 0                 |
| binary           | 8000         | 0           | 0       | 0                 |
| char             | 8000         | 0           | 0       | 0                 |
| timestamp        | 8            | 0           | 0       | 0                 |
| nvarchar         | 8000         | 0           | 0       | 0                 |
| nchar            | 8000         | 0           | 0       | 0                 |
| xml              | -1           | 0           | 0       | 0                 |
| sysname          | 256          | 0           | 0       | 0                 |
+------------------+--------------+-------------+---------+-------------------+

Dessa är datatyperna i den aktuella databasen. Om du byter till en annan databas kan du få olika resultat (detta beror till stor del på om några användardefinierade datatyper eller aliasdatatyper har definierats, och om de skiljer sig mellan databaserna eller inte).

Exempel 2 – Alias ​​och användardefinierade datatyper

I det föregående exemplet inkluderade jag koden is_user_defined kolumn. Vi kan se att ingen av datatyperna är användardefinierade eller aliasdatatyper, eftersom de alla har 0 som deras värde.

Låt oss skapa en aliasdatatyp och sedan se hur den visas i resultaten.

Skapa aliasdatatypen:

CREATE TYPE SSN  
FROM varchar(11) NOT NULL;

Låt oss nu köra frågan igen.

SELECT 
  name,
  max_length,
  [precision],
  scale,
  is_user_defined
FROM sys.types;

Resultat:

+------------------+--------------+-------------+---------+-------------------+
| name             | max_length   | precision   | scale   | is_user_defined   |
|------------------+--------------+-------------+---------+-------------------|
| image            | 16           | 0           | 0       | 0                 |
| text             | 16           | 0           | 0       | 0                 |
| uniqueidentifier | 16           | 0           | 0       | 0                 |
| date             | 3            | 10          | 0       | 0                 |
| time             | 5            | 16          | 7       | 0                 |
| datetime2        | 8            | 27          | 7       | 0                 |
| datetimeoffset   | 10           | 34          | 7       | 0                 |
| tinyint          | 1            | 3           | 0       | 0                 |
| smallint         | 2            | 5           | 0       | 0                 |
| int              | 4            | 10          | 0       | 0                 |
| smalldatetime    | 4            | 16          | 0       | 0                 |
| real             | 4            | 24          | 0       | 0                 |
| money            | 8            | 19          | 4       | 0                 |
| datetime         | 8            | 23          | 3       | 0                 |
| float            | 8            | 53          | 0       | 0                 |
| sql_variant      | 8016         | 0           | 0       | 0                 |
| ntext            | 16           | 0           | 0       | 0                 |
| bit              | 1            | 1           | 0       | 0                 |
| decimal          | 17           | 38          | 38      | 0                 |
| numeric          | 17           | 38          | 38      | 0                 |
| smallmoney       | 4            | 10          | 4       | 0                 |
| bigint           | 8            | 19          | 0       | 0                 |
| hierarchyid      | 892          | 0           | 0       | 0                 |
| geometry         | -1           | 0           | 0       | 0                 |
| geography        | -1           | 0           | 0       | 0                 |
| varbinary        | 8000         | 0           | 0       | 0                 |
| varchar          | 8000         | 0           | 0       | 0                 |
| binary           | 8000         | 0           | 0       | 0                 |
| char             | 8000         | 0           | 0       | 0                 |
| timestamp        | 8            | 0           | 0       | 0                 |
| nvarchar         | 8000         | 0           | 0       | 0                 |
| nchar            | 8000         | 0           | 0       | 0                 |
| xml              | -1           | 0           | 0       | 0                 |
| sysname          | 256          | 0           | 0       | 0                 |
| SSN              | 11           | 0           | 0       | 1                 |
+------------------+--------------+-------------+---------+-------------------+

Den nya datatypen visas (längst ned). Den har också värdet 1 i is_user_defined kolumn.

sys.systypes Visa

Det finns också en sys.systypes systemkompatibilitetsvy, som endast tillhandahålls för bakåtkompatibilitet. Detta beror på att systypes var namnet på en systemtabell i SQL Server 2000, och det kan finnas många äldre system där ute med kod som refererar till den tabellen.

Microsoft har angett att sys.systypes systemkompatibilitetsvy kommer att tas bort i en framtida version av Microsoft SQL Server, och rekommenderar därför att du undviker att använda denna vy i nytt arbete.

Med andra ord, använd sys.types istället om du kan.

Men om du fortfarande använder en tidigare version av SQL Server måste du använda sys.systypes .

Observera att sys.systypes innehåller olika kolumner/kolumnnamn till sys.types , så kolumnnamnen jag använde i föregående exempel fungerar inte.

Du kan fortfarande välja alla kolumner med asterisken (* ) jokertecken dock:

SELECT * FROM sys.systypes;

  1. Hur ROW_NUMBER() fungerar i SQL Server

  2. _gc_fusion_compression

  3. MySQL lista alla procedurer

  4. Itererar över heltal[] i PL/pgSQL