Kromě mnoha datových typů dostupných v SQL Server máte také možnost vytvořit si vlastní datový typ. Některé z nich jsou označovány jako „uživatelsky definované datové typy“, zatímco jiné jsou označovány jako „aliasové datové typy“.
uživatelsky definovaný datový typ je implementován prostřednictvím třídy sestavení v Microsoft.NET Framework Common Language Runtime (CLR).
typ dat aliasu je založen na nativním typu systému SQL Server. Jinými slovy, jako základ datového typu aliasu používáte existující datový typ.
Když jsem to řekl, viděl jsem, že Microsoft používá termín „uživatelem definovaný datový typ alias“, když odkazuje na aliasový datový typ. Také jsem viděl, že se to nazývá jednoduše „alias datového typu“.
Ať tak či onak, tento článek ukazuje, jak vytvořit uživatelem definovaný alias datového typu pomocí Transact-SQL.
Příklad 1 – Vytvoření aliasového datového typu
Chcete-li vytvořit typ dat aliasu, spusťte CREATE TYPE
příkaz k databázi, že chcete vytvořit datový typ alias.
Zde je příklad kódu, který vytvoří uživatelem definovaný alias datového typu na základě varchar serveru SQL Server datový typ:
USE Test; CREATE TYPE clientcode FROM varchar(8) NOT NULL;
Výsledek:
Commands completed successfully. Total execution time: 00:00:00.028
V tomto případě vytvořím alias datový typ s názvem clientcode v databázi nazvané Test .
Můj alias je založen na varchar(8) , což znamená, že to může být řetězec s proměnnou délkou až do délky 8 bajtů. U jednobajtových znakových sad (jako je latinka) se uloží až 8 znaků. U vícebajtových znakových sad kódování však může být počet znaků menší.
Příklad 2 – Zobrazení typu dat aliasu
Můžete použít sys.types
pro kontrolu podrobností o typu dat aliasu:
SELECT * FROM sys.types WHERE name = 'clientcode';
Výsledek:
name | clientcode system_type_id | 167 user_type_id | 257 schema_id | 1 principal_id | NULL max_length | 8 precision | 0 scale | 0 collation_name | SQL_Latin1_General_CP1_CI_AS is_nullable | 0 is_user_defined | 1 is_assembly_type | 0 default_object_id | 0 rule_object_id | 0 is_table_type | 0
Vidíme, že is_user_defined příznak pro tento datový typ je 1 , což znamená, že jde o uživatelsky definovaný datový typ.
V tomto příkladu jsem zúžil výsledky pouze na
kód klienta
datový typ. Můžete použít sys.types
vrátit informace o všech typech dat v databázi. Další informace naleznete v části Jak vrátit seznam typů dat na serveru SQL.
Nyní, když je datový typ alias vytvořen, můžeme pokračovat a používat jej.
Příklad 3 – Vytvoření tabulky, která používá alias
V tomto příkladu vytvořím tabulku, která používá můj nově vytvořený alias datového typu v jedné ze svých definic sloupců.
USE Test; CREATE TABLE Client ( ClientCode clientcode PRIMARY KEY, FirstName varchar(50), LastName varchar(50) );
Můžeme se rychle podívat na sloupce v tabulce:
SELECT c.name, c.system_type_id, c.user_type_id, c.max_length, c.is_nullable FROM sys.columns c INNER JOIN sys.tables t ON t.object_id = c.object_id WHERE t.name = 'Client';
Výsledky:
+------------+------------------+----------------+--------------+---------------+ | name | system_type_id | user_type_id | max_length | is_nullable | |------------+------------------+----------------+--------------+---------------| | ClientCode | 167 | 257 | 8 | 0 | | FirstName | 167 | 167 | 50 | 1 | | LastName | 167 | 167 | 50 | 1 | +------------+------------------+----------------+--------------+---------------+
Existuje mnohem více sloupců dat, ale zúžil jsem je pouze na některé, které jsou pro tento článek relevantní.
Příklad 4 – Vložení dat
Nyní je čas vložit data do sloupce, který používá náš uživatelsky definovaný alias datového typu.
INSERT INTO Client VALUES ('aaa00001', 'Satoshi', 'Nakamoto');
A nyní vyberte řádek:
SELECT * FROM Client;
Výsledek:
+--------------+-------------+------------+ | ClientCode | FirstName | LastName | |--------------+-------------+------------| | aaa00001 | Satoshi | Nakamoto | +--------------+-------------+------------+
Můžeme tedy vidět, že náš datový typ alias přijal zadaná data.
Ale nebyl by to správný test, pokud bychom se ho nepokusili prolomit.
Zkusme vložit hodnotu, která neodpovídá našemu aliasu:
INSERT INTO Client VALUES ('aaaa00002', 'Mikko', 'Linnamäki');
Výsledek:
Msg 8152, Level 16, State 30, Line 1 String or binary data would be truncated.
V tomto případě jsem se pokusil vložit hodnotu, která by vyžadovala 9 bajtů k uložení, ale alias přijímá pouze hodnoty do 8 bajtů, takže jej odmítl.
Pokud odstraním jednu z postav, funguje to dobře:
INSERT INTO Client VALUES ('aaa00002', 'Mikko', 'Linnamäki'); SELECT * FROM Client;
Výsledek:
+--------------+-------------+------------+ | ClientCode | FirstName | LastName | |--------------+-------------+------------| | aaa00001 | Satoshi | Nakamoto | | aaa00002 | Mikko | Linnamäki | +--------------+-------------+------------+