Ngoài nhiều kiểu dữ liệu có sẵn trong SQL Server, bạn cũng có tùy chọn tạo kiểu dữ liệu của riêng mình. Một số trong số này được gọi là "kiểu dữ liệu do người dùng xác định", trong khi những người khác được gọi là "kiểu dữ liệu bí danh".
kiểu dữ liệu do người dùng xác định được triển khai thông qua một lớp của hợp ngữ trong Microsoft.NET Framework ngôn ngữ chạy ngôn ngữ chung (CLR).
Một kiểu dữ liệu bí danh dựa trên kiểu hệ thống gốc SQL Server. Nói cách khác, bạn sử dụng kiểu dữ liệu hiện có làm cơ sở cho kiểu dữ liệu bí danh của mình.
Phải nói rằng, tôi đã thấy Microsoft sử dụng thuật ngữ “bí danh kiểu dữ liệu do người dùng xác định” khi đề cập đến kiểu dữ liệu bí danh. Tôi cũng từng thấy nó được gọi đơn giản là “bí danh kiểu dữ liệu”.
Dù bằng cách nào, bài viết này trình bày cách tạo bí danh kiểu dữ liệu do người dùng xác định bằng cách sử dụng Transact-SQL.
Ví dụ 1 - Tạo kiểu dữ liệu bí danh
Để tạo kiểu dữ liệu bí danh, hãy chạy CREATE TYPE
câu lệnh chống lại cơ sở dữ liệu mà bạn muốn tạo kiểu dữ liệu bí danh.
Dưới đây là một ví dụ mã tạo bí danh kiểu dữ liệu do người dùng xác định dựa trên SQL Server varchar kiểu dữ liệu:
USE Test; CREATE TYPE clientcode FROM varchar(8) NOT NULL;
Kết quả:
Commands completed successfully. Total execution time: 00:00:00.028
Trong trường hợp này, tôi tạo một kiểu dữ liệu bí danh được gọi là mã máy khách trong cơ sở dữ liệu có tên Kiểm tra .
Bí danh của tôi dựa trên varchar (8) , có nghĩa là nó có thể là một chuỗi có độ dài thay đổi có độ dài lên đến 8 byte. Đối với bộ ký tự mã hóa một byte (chẳng hạn như tiếng Latinh), bộ ký tự này sẽ lưu trữ tối đa 8 ký tự. Tuy nhiên, đối với bộ ký tự mã hóa nhiều byte, số lượng ký tự có thể ít hơn.
Ví dụ 2 - Xem kiểu dữ liệu bí danh
Bạn có thể sử dụng sys.types
để kiểm tra chi tiết về loại dữ liệu bí danh của bạn:
SELECT * FROM sys.types WHERE name = 'clientcode';
Kết quả:
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
Chúng ta có thể thấy rằng is_user_defined cờ cho kiểu dữ liệu này là 1 , nghĩa là đó là kiểu dữ liệu do người dùng xác định.
Trong ví dụ này, tôi đã thu hẹp kết quả thành chỉ
mã máy khách
loại dữ liệu. Bạn có thể sử dụng sys.types
để trả về thông tin về tất cả các kiểu dữ liệu trong cơ sở dữ liệu. Xem Cách trả về danh sách các kiểu dữ liệu trong SQL Server để biết thêm thông tin.
Bây giờ, kiểu dữ liệu bí danh đã được tạo, chúng ta có thể tiếp tục và sử dụng nó.
Ví dụ 3 - Tạo bảng sử dụng bí danh
Trong ví dụ này, tôi tạo một bảng sử dụng bí danh kiểu dữ liệu mới tạo của tôi trong một trong các định nghĩa cột của nó.
USE Test; CREATE TABLE Client ( ClientCode clientcode PRIMARY KEY, FirstName varchar(50), LastName varchar(50) );
Chúng ta có thể xem nhanh các cột trong bảng:
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';
Kết quả:
+------------+------------------+----------------+--------------+---------------+ | 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 | +------------+------------------+----------------+--------------+---------------+
Có nhiều cột dữ liệu khác nhưng tôi đã thu hẹp nó chỉ thành một số cột có liên quan đến bài viết này.
Ví dụ 4 - Chèn dữ liệu
Bây giờ đã đến lúc chèn dữ liệu vào cột sử dụng bí danh kiểu dữ liệu do người dùng xác định.
INSERT INTO Client VALUES ('aaa00001', 'Satoshi', 'Nakamoto');
Và bây giờ hãy chọn hàng:
SELECT * FROM Client;
Kết quả:
+--------------+-------------+------------+ | ClientCode | FirstName | LastName | |--------------+-------------+------------| | aaa00001 | Satoshi | Nakamoto | +--------------+-------------+------------+
Vì vậy, chúng tôi có thể thấy rằng kiểu dữ liệu bí danh của chúng tôi đã chấp nhận dữ liệu như được chỉ định.
Nhưng nó sẽ không phải là một bài kiểm tra thích hợp trừ khi chúng tôi cố gắng phá vỡ nó.
Hãy thử chèn một giá trị không tuân theo bí danh của chúng ta:
INSERT INTO Client VALUES ('aaaa00002', 'Mikko', 'Linnamäki');
Kết quả:
Msg 8152, Level 16, State 30, Line 1 String or binary data would be truncated.
Trong trường hợp này, tôi đã cố gắng chèn một giá trị yêu cầu 9 byte để lưu trữ, nhưng bí danh chỉ chấp nhận các giá trị tối đa 8 byte, vì vậy nó đã từ chối nó.
Nếu tôi xóa một trong các ký tự, nó vẫn hoạt động tốt:
INSERT INTO Client VALUES ('aaa00002', 'Mikko', 'Linnamäki'); SELECT * FROM Client;
Kết quả:
+--------------+-------------+------------+ | ClientCode | FirstName | LastName | |--------------+-------------+------------| | aaa00001 | Satoshi | Nakamoto | | aaa00002 | Mikko | Linnamäki | +--------------+-------------+------------+