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

Tạo một hàm vô hướng do người dùng xác định trong SQL Server

Trong SQL Server, bạn có thể tạo một hàm vô hướng do người dùng xác định bằng cách sử dụng CREATE FUNCTION tuyên bố. Một hàm vô hướng do người dùng xác định, còn được gọi là UDF vô hướng, là một hàm do người dùng xác định trả về một giá trị duy nhất.

Bài viết này chứa các ví dụ về cách tạo một số UDF vô hướng T-SQL cơ bản.

Cú pháp

Trước tiên, hãy xem cú pháp để tạo UDF vô hướng.

Cú pháp cho các UDF vô hướng T-SQL như sau:

 TẠO [HOẶC ALTER] CHỨC NĂNG [schema_name. ] function_name ([{@parameter_name. BEGIN function_body RETURN biểu_thức vô hướng END [; ] 

Và cú pháp cho UDF vô hướng CLR:

 TẠO [HOẶC ALTER] CHỨC NĂNG [schema_name. ] function_name ({@parameter_name [AS] [type_schema_name.] parameter_data_type [=default]} [, ... n]) RETURNS {return_data_type} [VỚI  [, ... n]] [NHƯ] TÊN BÊN NGOÀI  [; ] 

Các bộ phận tại <function_option> cho các hàm T-SQL và <clr_function_option> đối với các chức năng CLR cho phép bạn chỉ định các tùy chọn cho UDF. Các tùy chọn chức năng bao gồm thêm mã hóa, liên kết lược đồ, EXECUTE AS , cũng như chỉ định việc cần làm khi giá trị NULL được truyền dưới dạng đối số.

Bạn có thể tìm thấy danh sách đầy đủ các đối số và tùy chọn chức năng trên trang web của Microsoft.

Tài liệu của Microsoft chứa rất nhiều chi tiết, vì vậy các ví dụ sau nhằm cung cấp cái nhìn tổng quan nhanh về một số khái niệm và tùy chọn phổ biến khi tạo UDF vô hướng.

Ví dụ 1 - UDF vô hướng cơ bản

Đây là ví dụ về mã được sử dụng để tạo UDF vô hướng T-SQL cơ bản.

 TẠO CHỨC NĂNG dbo.ufn_discountPrice (@price DECIMAL (12,2), @discount DECIMAL (12,2)) QUAY LẠI KHOẢNG CÁCH (12,2) ASBEGIN RETURN @price * (1 - @discount); HẾT;  

UDF vô hướng này chấp nhận hai tham số; @price@discount . Chúng được chuyển vào hàm dưới dạng đối số bất cứ khi nào hàm được gọi. Hàm nhận giá trị của các đối số đó, thực hiện phép tính bằng cách sử dụng các giá trị đó, sau đó trả về giá trị kết quả. Trong trường hợp này, giá đã chiết khấu sẽ được trả lại.

Ví dụ 2 - Gọi UDF

Khi UDF đã được tạo, nó có thể được gọi trong mã T-SQL bất kỳ lúc nào bạn cần.

Dưới đây là một ví dụ về cách gọi UDF:

 CHỌN dbo.ufn_discountPrice (100, .2) AS Kết quả; 

Kết quả

 + ---------- + | Kết quả || ---------- || 80,00 | + ---------- + 

Ví dụ 3 - Truy vấn bảng

UDF vô hướng cũng có thể thực hiện những công việc như bảng cơ sở dữ liệu truy vấn.

Đây là một trong những trả về số lượng album có trong cơ sở dữ liệu cho một nghệ sĩ nhất định.

 TẠO CHỨC NĂNG dbo.ufn_CountAlbums (@ArtistId int) QUAY LẠI smallintAS BẮT ĐẦU KHAI BÁO @AlbumCount int; CHỌN @AlbumCount =COUNT (AlbumId) TỪ Album TẠI ĐÓ ArtistId =@ArtistId; QUAY LẠI @AlbumCount; HẾT; 

Đây là một hàm vô hướng vì nó trả về một giá trị duy nhất. Nếu chúng tôi muốn trả về danh sách các anbom, thì chúng tôi cần sử dụng hàm định giá trị bảng, vì các hàm định giá trị bảng trả về kết quả của nó dưới dạng một tập hợp các hàng.

Ví dụ 4 - Liên kết lược đồ

Khi bạn tạo một hàm do người dùng xác định phụ thuộc vào các đối tượng khác trong cơ sở dữ liệu, thường là ý tưởng tốt để liên kết lược đồ với UDF. Lược đồ ràng buộc UDF đảm bảo rằng không có thay đổi nào có thể được thực hiện đối với các đối tượng bên dưới có khả năng ảnh hưởng đến chức năng.

Ví dụ:bạn sẽ không thể bỏ một bảng mà một UDF liên kết giản đồ sử dụng trong định nghĩa của nó.

Để lược đồ liên kết một UDF, hãy sử dụng WITH SCHEMABINDING trong định nghĩa của nó. Bạn cũng cần sử dụng tên gồm hai phần cho bất kỳ đối tượng nào được tham chiếu trong UDF.

Đây là ví dụ trước đó được viết lại để lược đồ được ràng buộc:

 TẠO CHỨC NĂNG dbo.ufn_CountAlbums (@ArtistId int) QUAY LẠI smallintWITH SCHEMABINDINGAS BẮT ĐẦU KHAI BÁO @AlbumCount int; CHỌN @AlbumCount =COUNT (AlbumId) TỪ dbo.Albums WHERE ArtistId =@ArtistId; QUAY LẠI @AlbumCount; HẾT; 

Vì vậy, tôi đã thay đổi hai điều từ ví dụ đầu tiên. Tôi đã thêm WITH SCHEMABINDING và tôi đã thay đổi Albums tới dbo.Albums .

Bây giờ, nếu ai đó cố gắng loại bỏ bảng đó hoặc thực hiện các thay đổi khác đối với nó, họ sẽ gặp lỗi.

Ví dụ 5 - Mã hóa

Bạn cũng có thể sử dụng WITH ENCRYPTION để mã hóa chức năng.

 TẠO CHỨC NĂNG dbo.ufn_CountAlbums (@ArtistId int) RETURNS smallintWITH ENCRYPTIONAS BẮT ĐẦU KHAI BÁO @AlbumCount int; CHỌN @AlbumCount =COUNT (AlbumId) TỪ dbo.Albums WHERE ArtistId =@ArtistId; QUAY LẠI @AlbumCount; HẾT; 

Ví dụ 6 - Đầu vào NULL

Khi gọi hàm, nếu bất kỳ đối số nào là NULL, phần thân của hàm vẫn được thực thi. Đó là, trừ khi bạn đã nêu rõ ràng RETURNS NULL ON NULL INPUT trong định nghĩa của hàm.

Chỉ định tùy chọn đó sẽ trả về NULL nếu bất kỳ đối số nào là NULL.

 TẠO CHỨC NĂNG dbo.ufn_CountAlbums (@ArtistId int) QUAY LẠI smallintWITH TRẢ LẠI KHÔNG ĐẦY ĐỦ TRÊN NULL INPUTAS BẮT ĐẦU KHAI BÁO @AlbumCount int; CHỌN @AlbumCount =COUNT (AlbumId) TỪ dbo.Albums WHERE ArtistId =@ArtistId; QUAY LẠI @AlbumCount; HẾT; 

Khi tôi gọi hàm bằng cách sử dụng NULL làm đối số:

 CHỌN dbo.ufn_CountAlbums (NULL) AS Kết quả; 

Tôi nhận được một kết quả khác, tùy thuộc vào những gì tôi đã chỉ định cho tùy chọn này.

Đây là kết quả khi hàm sử dụng cài đặt mặc định (CALLED ON NULL INPUT ):

 + ---------- + | Kết quả || ---------- || 0 | + ---------- + 

Và đây là kết quả khi nó sử dụng RETURNS NULL ON NULL INPUT :

 + ---------- + | Kết quả || ---------- || KHÔNG | + ---------- + 

Ví dụ 7 - Nhiều tùy chọn

Bạn có thể phân tách nhiều tùy chọn bằng dấu phẩy.

Dưới đây là một ví dụ thêm cả mã hóa và liên kết lược đồ vào hàm:

 TẠO CHỨC NĂNG dbo.ufn_CountAlbums (@ArtistId int) RETURNS smallintWITH ENCRYPTION, SCHEMABINDINGAS BẮT ĐẦU KHAI BÁO @AlbumCount int; CHỌN @AlbumCount =COUNT (AlbumId) TỪ dbo.Albums WHERE ArtistId =@ArtistId; QUAY LẠI @AlbumCount; HẾT; 

Ví dụ 8 - Thay đổi một hàm

Bạn có thể thay đổi UDF vô hướng bằng cách thay thế CREATE với ALTER .

 ALTER FUNCTION dbo.ufn_CountAlbums (@ArtistId int) RETURNS smallintWITH SCHEMABINDINGAS BẮT ĐẦU KHAI BÁO @AlbumCount int; CHỌN @AlbumCount =COUNT (AlbumId) TỪ dbo.Albums WHERE ArtistId =@ArtistId; QUAY LẠI @AlbumCount; HẾT; 

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dapper.NET và proc được lưu trữ với nhiều bộ kết quả

  2. DATETIMEOFFSETFROMPARTS () Ví dụ trong SQL Server (T-SQL)

  3. Tạo chỉ mục trên một biến bảng

  4. Cách điều chỉnh hiệu suất của SQL Server, Azure SQL Database và Amazon RDS

  5. Cách ROW_NUMBER () hoạt động trong SQL Server