Oprócz wielu typów danych dostępnych w SQL Server masz również możliwość stworzenia własnego typu danych. Niektóre z nich są określane jako „typy danych zdefiniowane przez użytkownika”, podczas gdy inne są określane jako „typy danych aliasów”.
typ danych zdefiniowany przez użytkownika jest implementowany przez klasę zestawu w środowisku uruchomieniowym języka wspólnego (CLR) Microsoft.NET Framework.
typ danych aliasu jest oparty na natywnym typie systemu SQL Server. Innymi słowy, używasz istniejącego typu danych jako podstawy typu danych aliasu.
Powiedziawszy to, widziałem, jak Microsoft używa terminu „alias typu danych zdefiniowanego przez użytkownika” w odniesieniu do typu danych aliasu. Widziałem również, że jest to po prostu „alias typu danych”.
Tak czy inaczej, w tym artykule pokazano, jak utworzyć alias typu danych zdefiniowanego przez użytkownika przy użyciu języka Transact-SQL.
Przykład 1 – Tworzenie aliasu typu danych
Aby utworzyć typ danych aliasu, uruchom CREATE TYPE
oświadczenie względem bazy danych, dla której chcesz utworzyć alias typu danych.
Oto przykład kodu, który tworzy alias typu danych zdefiniowany przez użytkownika na podstawie varchar programu SQL Server typ danych:
USE Test; CREATE TYPE clientcode FROM varchar(8) NOT NULL;
Wynik:
Commands completed successfully. Total execution time: 00:00:00.028
W tym przypadku tworzę aliasowy typ danych o nazwie kod klienta w bazie danych o nazwie Test .
Mój alias jest oparty na varchar(8) , co oznacza, że może to być ciąg znaków o zmiennej długości do 8 bajtów. W przypadku zestawów znaków kodowania jednobajtowego (takich jak łaciński), będzie to przechowywać do 8 znaków. Jednak w przypadku zestawów znaków kodowania wielobajtowego liczba znaków może być mniejsza.
Przykład 2 – Wyświetl typ danych aliasu
Możesz użyć sys.types
aby sprawdzić szczegóły typu danych aliasu:
SELECT * FROM sys.types WHERE name = 'clientcode';
Wynik:
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
Widzimy, że is_user_defined flaga dla tego typu danych to 1 , co oznacza, że jest to typ danych zdefiniowany przez użytkownika.
W tym przykładzie zawęziłem wyniki tylko do
kodu klienta
typ danych. Możesz użyć sys.types
zwrócić informacje o wszystkich typach danych w bazie danych. Zobacz Jak zwrócić listę typów danych w SQL Server, aby uzyskać więcej informacji.
Teraz, gdy typ danych aliasu został utworzony, możemy go używać.
Przykład 3 – Utwórz tabelę używającą aliasu
W tym przykładzie tworzę tabelę, która używa mojego nowo utworzonego aliasu typu danych w jednej z jej definicji kolumn.
USE Test; CREATE TABLE Client ( ClientCode clientcode PRIMARY KEY, FirstName varchar(50), LastName varchar(50) );
Możemy rzucić okiem na kolumny w tabeli:
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';
Wyniki:
+------------+------------------+----------------+--------------+---------------+ | 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 | +------------+------------------+----------------+--------------+---------------+
Jest o wiele więcej kolumn danych, ale zawęziłem je do tylko tych, które są istotne dla tego artykułu.
Przykład 4 – Wstaw dane
Teraz nadszedł czas, aby wstawić dane do kolumny, która korzysta z naszego zdefiniowanego przez użytkownika aliasu typu danych.
INSERT INTO Client VALUES ('aaa00001', 'Satoshi', 'Nakamoto');
A teraz wybierz wiersz:
SELECT * FROM Client;
Wynik:
+--------------+-------------+------------+ | ClientCode | FirstName | LastName | |--------------+-------------+------------| | aaa00001 | Satoshi | Nakamoto | +--------------+-------------+------------+
Widzimy więc, że nasz typ danych aliasu zaakceptował dane zgodnie ze specyfikacją.
Ale nie byłby to właściwy test, gdyby nie próba jego złamania.
Spróbujmy wstawić wartość, która nie pasuje do naszego aliasu:
INSERT INTO Client VALUES ('aaaa00002', 'Mikko', 'Linnamäki');
Wynik:
Msg 8152, Level 16, State 30, Line 1 String or binary data would be truncated.
W tym przypadku próbowałem wstawić wartość, która wymagałaby przechowywania 9 bajtów, ale alias akceptuje tylko wartości do 8 bajtów, więc go odrzucił.
Jeśli usunę jeden ze znaków, działa dobrze:
INSERT INTO Client VALUES ('aaa00002', 'Mikko', 'Linnamäki'); SELECT * FROM Client;
Wynik:
+--------------+-------------+------------+ | ClientCode | FirstName | LastName | |--------------+-------------+------------| | aaa00001 | Satoshi | Nakamoto | | aaa00002 | Mikko | Linnamäki | +--------------+-------------+------------+