sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man skapar ett användardefinierat datatypalias i SQL Server med T-SQL

Utöver de många datatyper som finns tillgängliga i SQL Server, har du även möjlighet att skapa din egen datatyp. Vissa av dessa kallas för "användardefinierade datatyper", medan andra kallas "aliasdatatyper".

En användardefinierad datatyp implementeras genom en klass av en assembly i Microsoft.NET Framework common language runtime (CLR).

En aliasdatatyp baseras på en inbyggd SQL Server-systemtyp. Med andra ord, du använder en befintlig datatyp som bas för din aliasdatatyp.

Med det sagt har jag sett Microsoft använda termen "användardefinierat datatypalias" när det hänvisar till en aliasdatatyp. Jag har också sett att det bara kallas ett "datatypalias".

Hur som helst, den här artikeln visar hur man skapar ett användardefinierat datatypalias med Transact-SQL.

Exempel 1 – Skapa en aliasdatatyp

För att skapa en aliasdatatyp, kör en CREATE TYPE uttalande mot databasen att du vill skapa aliasdatatypen.

Här är ett kodexempel som skapar ett användardefinierat datatypalias baserat på SQL Server varchar datatyp:

ANVÄND Test; SKAPA TYP klientkod FRÅN varchar(8) INTE NULL;

Resultat:

Kommandon har slutförts. Total körningstid:00:00:00.028

I det här fallet skapar jag en aliasdatatyp som heter klientkod i en databas som heter Test .

Mitt alias är baserat på varchar(8) , vilket innebär att det kan vara en sträng med variabel längd upp till 8 byte lång. För teckenuppsättningar för kodning av en byte (som latin), kommer detta att lagra upp till 8 tecken. För teckenuppsättningar för kodning med flera byte kan antalet tecken dock vara mindre.

Exempel 2 – Visa aliasdatatypen

Du kan använda sys.types för att kontrollera detaljerna för din aliasdatatyp:

SELECT * FROM sys.typesWHERE namn ='klientkod';

Resultat:

namn | clientcodesystem_type_id | 167user_type_id | 257schema_id | 1principal_id | NULLmax_längd | 8precision | 0 skala | 0kollationsnamn | SQL_Latin1_General_CP1_CI_ASis_nullable | 0is_user_defined | 1is_assembly_type | 0default_object_id | 0rule_object_id | 0is_table_type | 0

Vi kan se att är_användardefinierad flaggan för denna datatyp är 1 , vilket betyder att det är en användardefinierad datatyp.

I det här exemplet har jag begränsat resultaten till bara klientkoden data typ. Du kan använda sys.types att returnera information om alla datatyper i databasen. Se Hur man returnerar en lista över datatyper i SQL Server för mer information.

Nu när aliasdatatypen har skapats kan vi gå vidare och använda den.

Exempel 3 – Skapa en tabell som använder aliaset

I det här exemplet skapar jag en tabell som använder mitt nyskapade datatypalias i en av dess kolumndefinitioner.

ANVÄND Test; CREATE TABLE Client( ClientCode klientkod PRIMÄRKEY, FirstName varchar(50), LastName varchar(50));

Vi kan ta en snabb titt på kolumnerna 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';
>

Resultat:

+------------+-------------------+------------- --+--------------+--------------+| namn | system_type_id | user_type_id | max_längd | är_nullbar ||------------+------------------------+-------------------- --+--------------+--------------|| Klientkod | 167 | 257 | 8 | 0 || Förnamn | 167 | 167 | 50 | 1 || Efternamn | 167 | 167 | 50 | 1 |+------------+--------------------+------------------- --+--------------+---------------+

Det finns många fler kolumner med data men jag har begränsat det till bara några som är relevanta för den här artikeln.

Exempel 4 – Infoga data

Nu är det dags att infoga data i kolumnen som använder vårt användardefinierade datatypalias.

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

Och välj nu raden:

VÄLJ * FRÅN klient;

Resultat:

+--------------+-------------+------------+| Klientkod | Förnamn | Efternamn ||-------------+-------------+------------|| aaa00001 | Satoshi | Nakamoto |+--------------+-------------+------------+

Så vi kan se att vår aliasdatatyp har accepterat data som specificerats.

Men det skulle inte vara ett ordentligt test om vi inte försökte bryta det.

Låt oss försöka infoga ett värde som inte följer vårt alias:

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

Resultat:

Msg 8152, Level 16, State 30, Line 1String eller binär data skulle trunkeras.

I det här fallet försökte jag infoga ett värde som skulle kräva 9 byte för att lagra, men aliaset accepterar bara värden upp till 8 byte, så det avvisade det.

Om jag tar bort ett av tecknen fungerar det bra:

INSERT INTO ClientVALUES ('aaa00002', 'Mikko', 'Linnamäki');VÄLJ * FRÅN klient;

Resultat:

+--------------+-------------+------------+| Klientkod | Förnamn | Efternamn ||--------------+------------+-------------|| aaa00001 | Satoshi | Nakamoto || aaa00002 | Mikko | Linnamäki |+--------------+-------------+------------+

  1. sql-server välj första raden från en grupp

  2. Simulera SKAPA DATABAS OM INTE FINNS för PostgreSQL?

  3. Infoga om det inte finns Oracle

  4. Hur man ansluter till SQL-serverdatabas från en Windows 10 UWP-app