Udover de mange datatyper, der er tilgængelige i SQL Server, har du også mulighed for at oprette din egen datatype. Nogle af disse omtales som "brugerdefinerede datatyper", mens andre omtales som "aliasdatatyper".
En brugerdefineret datatype er implementeret gennem en klasse af en assembly i Microsoft.NET Framework common language runtime (CLR).
En aliasdatatype er baseret på en SQL Server-native systemtype. Med andre ord, du bruger en eksisterende datatype som grundlag for din alias datatype.
Når det er sagt, har jeg set Microsoft bruge udtrykket "brugerdefineret datatype alias", når det refererer til en alias datatype. Jeg har også set det omtalt som blot et "datatypealias".
Uanset hvad, så viser denne artikel, hvordan man opretter et brugerdefineret datatypealias ved hjælp af Transact-SQL.
Eksempel 1 – Opret en aliasdatatype
For at oprette en aliasdatatype skal du køre en CREATE TYPE
sætning mod databasen, at du vil oprette aliasdatatypen.
Her er et kodeeksempel, der opretter et brugerdefineret datatypealias baseret på SQL Server varchar datatype:
BRUG Test;CREATE TYPE clientcode FROM varchar(8) NOT NULL;
Resultat:
Kommandoer gennemført med succes. Samlet udførelsestid:00:00:00.028
I dette tilfælde opretter jeg en aliasdatatype kaldet klientkode i en database kaldet Test .
Mit alias er baseret på varchar(8) , hvilket betyder, at det kan være en streng med variabel længde på op til 8 bytes i længden. For enkelt-byte-tegnsæt (såsom latin) gemmer dette op til 8 tegn. For multi-byte-tegnsæt kan antallet af tegn dog være mindre.
Eksempel 2 – Se aliasdatatypen
Du kan bruge sys.types
for at kontrollere detaljerne for din aliasdatatype:
SELECT * FROM sys.typesWHERE navn ='klientkode';
Resultat:
Vi kan se, at er_bruger_defineret flag for denne datatype er 1 , hvilket betyder, at det er en brugerdefineret datatype.
I dette eksempel indsnævrede jeg resultaterne til kun
klientkoden
datatype. Du kan bruge sys.types
at returnere oplysninger om alle datatyper i databasen. Se Sådan returneres en liste over datatyper i SQL Server for at få flere oplysninger.
Nu hvor aliasdatatypen er blevet oprettet, kan vi gå videre og bruge den.
Eksempel 3 – Opret en tabel, der bruger aliaset
I dette eksempel opretter jeg en tabel, der bruger mit nyoprettede datatypealias i en af dens kolonnedefinitioner.
BRUG Test;CREATE TABLE Client( ClientCode clientcode PRIMÆR NØGLE, Fornavn varchar(50), Efternavn varchar(50));
Vi kan tage et hurtigt kig på kolonnerne i tabellen:
SELECT c.name, c.system_type_id, c.user_type_id, c.max_length, c.is_nullableFROM sys.columns cINNER JOIN sys.tables tON t.object_id =c.object_idWHERE t.name ='Client';>
Resultater:
+------------+------------------------+------------------- --+--------------+--------------+| navn | system_type_id | brugertype_id | max_længde | er_nullbar ||----------------------------------- --+--------------+--------------|| Klientkode | 167 | 257 | 8 | 0 || Fornavn | 167 | 167 | 50 | 1 || Efternavn | 167 | 167 | 50 | 1 |+------------+--------------------+--------- --+--------------+---------------+
Der er mange flere kolonner med data, men jeg har indsnævret dem til blot nogle, der er relevante for denne artikel.
Eksempel 4 – Indsæt data
Nu er det tid til at indsætte data i kolonnen, der bruger vores brugerdefinerede datatype-alias.
INSERT INTO ClientVALUES ('aaa00001', 'Satoshi', 'Nakamoto');
Og vælg nu rækken:
VÆLG * FRA klient;
Resultat:
+--------------+-------------+------------+| Klientkode | Fornavn | Efternavn ||--------------+-------------+------------|| aaa00001 | Satoshi | Nakamoto |+--------------+-------------+------------+
Så vi kan se, at vores alias datatype har accepteret dataene som specificeret.
Men det ville ikke være en ordentlig test, medmindre vi forsøgte at bryde den.
Lad os prøve at indsætte en værdi, der ikke overholder vores alias:
INSERT INTO ClientVALUES ('aaaa00002', 'Mikko', 'Linnamäki');
Resultat:
Besked 8152, niveau 16, tilstand 30, linje 1-streng eller binære data vil blive afkortet.
I dette tilfælde forsøgte jeg at indsætte en værdi, der ville kræve 9 bytes at gemme, men aliasset accepterer kun værdier op til 8 bytes, så det afviste det.
Hvis jeg fjerner et af tegnene, fungerer det fint:
INSERT INTO ClientVALUES ('aaa00002', 'Mikko', 'Linnamäki'); SELECT * FROM Client;
Resultat:
+--------------+-------------+------------+| Klientkode | Fornavn | Efternavn ||--------------+-------------+------------|| aaa00001 | Satoshi | Nakamoto || aaa00002 | Mikko | Linnamäki |+--------------+-------------+------------+