Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách tạo bí danh kiểu dữ liệu do người dùng xác định trong SQL Server bằng T-SQL

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách thay thế một chuỗi trong cột bảng SQL Server

  2. Cách tạo Ràng buộc Duy nhất trên Nhiều Cột trong SQL Server - Hướng dẫn SQL Server / TSQL Phần 96

  3. Hết thời gian truy vấn từ ứng dụng web nhưng chạy tốt từ studio quản lý

  4. Thiếu cấu phần phần mềm com.microsoft.sqlserver:sqljdbc4:jar:4.0

  5. Ý nghĩa của 1/1/1753 trong SQL Server là gì?