sql >> Databáze >  >> RDS >> Sqlserver

Jak vytvořit alias datového typu definovaného uživatelem na serveru SQL pomocí T-SQL

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  |
+--------------+-------------+------------+

  1. Balíček SSIS nechce načíst metadata dočasné tabulky

  2. Naučte se, jak zacházet s výjimkami v PL/SQL

  3. Oracle Security Alert pro CVE-2021-44228

  4. Došlo k chybě JNI, zkontrolujte prosím svou instalaci a zkuste to znovu v Eclipse x86 Windows 8.1