sql >> Database >  >> RDS >> Sqlserver

Een door de gebruiker gedefinieerde gegevenstype-alias maken in SQL Server met behulp van T-SQL

Naast de vele datatypes die in SQL Server beschikbaar zijn, heb je ook de mogelijkheid om je eigen datatype aan te maken. Sommige hiervan worden "door de gebruiker gedefinieerde gegevenstypen" genoemd, terwijl andere worden aangeduid als "alias-gegevenstypen".

Een door de gebruiker gedefinieerd gegevenstype wordt geïmplementeerd via een klasse van een assembly in de Microsoft.NET Framework Common Language Runtime (CLR).

Een alias gegevenstype is gebaseerd op een native systeemtype van SQL Server. Met andere woorden, u gebruikt een bestaand gegevenstype als basis voor uw aliasgegevenstype.

Dat gezegd hebbende, heb ik gezien dat Microsoft de term "door de gebruiker gedefinieerde gegevenstype-alias" gebruikt bij het verwijzen naar een alias-gegevenstype. Ik heb ook gezien dat het gewoon een "gegevenstype-alias" wordt genoemd.

Hoe dan ook, dit artikel laat zien hoe u een door de gebruiker gedefinieerde gegevenstype-alias maakt met Transact-SQL.

Voorbeeld 1 – Maak een aliasgegevenstype

Voer een CREATE TYPE . uit om een ​​aliasgegevenstype te maken statement tegen de database dat u het aliasgegevenstype wilt maken.

Hier is een codevoorbeeld dat een door de gebruiker gedefinieerde alias van het gegevenstype maakt op basis van de SQL Server varchar gegevenstype:

GEBRUIK Test;CREER TYPE cliëntcode VANUIT varchar(8) NIET NULL;

Resultaat:

Opdrachten succesvol voltooid. Totale uitvoeringstijd:00:00:00.028

In dit geval maak ik een alias-gegevenstype met de naam clientcode in een database genaamd Test .

Mijn alias is gebaseerd op varchar(8) , wat betekent dat het een string met variabele lengte tot 8 bytes lang kan zijn. Voor enkelbyte-coderingstekensets (zoals Latijn), worden hierin maximaal 8 tekens opgeslagen. Voor tekensets met multi-bytecodering kan het aantal tekens echter kleiner zijn.

Voorbeeld 2 – Bekijk het aliasgegevenstype

U kunt sys.types . gebruiken om de details van uw aliasgegevenstype te controleren:

SELECT * FROM sys.typesWHERE naam ='clientcode';

Resultaat:

naam | clientcodesystem_type_id | 167user_type_id | 257schema_id | 1principal_id | NULLmax_lengte | 8precisie | 0schaal | 0collatienaam | SQL_Latin1_General_CP1_CI_ASis_nullable | 0is_user_defined | 1is_assembly_type | 0default_object_id | 0rule_object_id | 0is_table_type | 0

We kunnen zien dat de is_user_defined vlag voor dit gegevenstype is 1 , wat betekent dat het een door de gebruiker gedefinieerd gegevenstype is.

In dit voorbeeld heb ik de resultaten beperkt tot alleen de clientcode data type. U kunt sys.types . gebruiken om informatie terug te geven over alle gegevenstypen in de database. Zie Een lijst met gegevenstypen retourneren in SQL Server voor meer informatie.

Nu het alias-gegevenstype is gemaakt, kunnen we doorgaan en het gebruiken.

Voorbeeld 3 – Maak een tabel die de alias gebruikt

In dit voorbeeld maak ik een tabel die mijn nieuw gemaakte gegevenstype-alias gebruikt in een van de kolomdefinities.

GEBRUIK Test;CREATE TABLE Client( ClientCode clientcode PRIMARY KEY, FirstName varchar(50), LastName varchar(50));

We kunnen snel de kolommen in de tabel bekijken:

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';

Resultaten:

+------------+------------------+-------------- --+--------------+---------------+| naam | system_type_id | user_type_id | max_lengte | is_nullable ||------------+------------------+--------------- -+--------------+---------------|| Klantcode | 167 | 257 | 8 | 0 || Voornaam | 167 | 167 | 50 | 1 || Achternaam | 167 | 167 | 50 | 1 |+------------+------------------+--------------- -+--------------+---------------+

Er zijn veel meer kolommen met gegevens, maar ik heb het beperkt tot slechts enkele die relevant zijn voor dit artikel.

Voorbeeld 4 – Gegevens invoegen

Nu is het tijd om gegevens in te voegen in de kolom die onze door de gebruiker gedefinieerde gegevenstype-alias gebruikt.

INSERT INTO ClientVALUES ('aaa00001', 'Satoshi', 'Nakamoto');

En selecteer nu de rij:

SELECTEER * VAN Klant;

Resultaat:

+--------------+-------------+------------+| Klantcode | Voornaam | Achternaam ||--------------+-------------+------------|| aaa00001 | Satoshi | Nakamoto |+--------------+-------------+------------+

We kunnen dus zien dat ons alias-gegevenstype de gegevens heeft geaccepteerd zoals gespecificeerd.

Maar het zou geen goede test zijn, tenzij we probeerden het te doorbreken.

Laten we proberen een waarde in te voegen die niet overeenkomt met onze alias:

INSERT INTO ClientVALUES ('aaaa00002', 'Mikko', 'Linnamäki');

Resultaat:

Msg 8152, Level 16, State 30, Line 1String of binaire gegevens worden afgekapt.

In dit geval heb ik geprobeerd een waarde in te voegen waarvoor 9 bytes nodig zijn om op te slaan, maar de alias accepteert alleen waarden tot 8 bytes, dus werd deze afgewezen.

Als ik een van de tekens verwijder, werkt het prima:

INSERT INTO ClientVALUES ('aaa00002', 'Mikko', 'Linnamäki');SELECT * FROM Client;

Resultaat:

+--------------+-------------+------------+| Klantcode | Voornaam | Achternaam ||--------------+-------------+------------|| aaa00001 | Satoshi | Nakamoto || aaa00002 | Mikko | Linnamäki |+--------------+-------------+------------+

  1. Onthoud RAC-instanties in Perf Tools

  2. MySQL:transactie binnen een opgeslagen procedure

  3. Verbeterde SQLite-querysyntaxis op Android

  4. datetime vs smalldatetime in SQL Server:wat is het verschil?