SQL Server đi kèm với một bộ sưu tập các chức năng tích hợp cho phép bạn thực hiện nhiều thao tác khác nhau. Mỗi chức năng tích hợp phục vụ một mục đích cụ thể và không thể sửa đổi. Nếu một chức năng phục vụ mục đích của bạn, bạn có thể tiếp tục và sử dụng nó.
Nhưng điều gì sẽ xảy ra nếu bạn không thể tìm thấy một chức năng phục vụ cho mục đích của mình?
Sau đó, đã đến lúc viết hàm do người dùng xác định của riêng bạn.
Hàm do người dùng xác định là gì?
Một chức năng do người dùng xác định (UDF) là một quy trình có thể nhận các tham số, thực hiện các phép tính hoặc các hành động khác và trả về một kết quả. Và như tên cho thấy, nó được định nghĩa và tạo ra bởi người dùng. Trong trường hợp này, “người dùng” là lập trình viên SQL, DBA hoặc bất kỳ ai đã viết hàm.
Thuật ngữ hàm do người dùng xác định phân biệt nó với các hàm tích hợp được vận chuyển cùng với SQL Server.
Bạn có thể chỉ định liệu UDF có chấp nhận bất kỳ tham số nào hay không và nếu có thì tên, kiểu dữ liệu của chúng, v.v. Ví dụ:bạn có thể viết UDF chấp nhận ID sản phẩm làm đối số. Sau đó, hàm có thể sử dụng nó trong tính toán của nó. Điều này có nghĩa là đầu ra của hàm sẽ phụ thuộc vào đầu vào được cung cấp cho nó khi nó được gọi.
Khi một UDF đã được tạo, nó có thể được gọi.
Gọi một hàm do người dùng xác định
Mã bên trong hàm không được thực thi khi hàm được tạo. Nó chỉ được thực thi khi hàm được gọi .
“Gọi” một hàm đôi khi được gọi là “gọi” một hàm. Đây là lúc bạn có được chức năng để làm những gì nó được tạo ra để làm. Về cơ bản, bạn tạo một hàm, và sau đó nó chỉ ngồi đó chờ được gọi.
Bạn có thể gọi một UDF từ mã T-SQL của mình, giống như bạn gọi một hàm hệ thống. Ví dụ:bạn có thể sử dụng UDF trong WHERE
để thu hẹp kết quả của SELECT
tuyên bố. Bạn cũng có thể sử dụng nó trong danh sách các cột để trả về.
UDF cũng có thể được sử dụng trong các cột được tính toán. Điều này có thể hữu ích nếu bạn cần một cột được tính toán để truy cập dữ liệu trong một cột khác.
Tham số
Một chức năng do người dùng xác định có thể chấp nhận tới 1024 tham số đầu vào. Tuy nhiên, bạn cũng có thể xác định một hàm mà không có bất kỳ tham số nào nếu được yêu cầu.
Ví dụ về một hàm tích hợp không có bất kỳ tham số nào là GETDATE()
. Hàm này chỉ trả về dấu thời gian của hệ thống cơ sở dữ liệu hiện tại. Không cần phải chuyển bất kỳ tham số nào để có được điều đó.
Ví dụ về một hàm do người dùng xác định với một thông số duy nhất có thể là một hàm trả về chi tiết liên hệ của khách hàng dựa trên ID của khách hàng. Khi bạn gọi hàm, bạn chuyển ID của khách hàng cho hàm dưới dạng tham số. Sau đó, hàm có thể tra cứu thông tin chi tiết của khách hàng và trả lại chúng trong biến trả về. Nếu bạn nhập ID của khách hàng khác, hàm sẽ trả về thông tin chi tiết cho khách hàng đó.
Lợi ích của các chức năng do người dùng xác định
Một số lợi ích chính của UDF bao gồm những điều sau đây.
- Lập trình mô-đun
- UDF cho phép bạn viết mã một lần, sau đó gọi nó nhiều lần nếu cần. Không cần phải viết lại cùng một mã mỗi khi bạn cần làm điều tương tự. Thay vào đó, chỉ cần gọi hàm. Điều này cũng có lợi nếu có gì đó thay đổi. Bạn chỉ cần cập nhật nó ở một nơi - chức năng. Nếu bạn không sử dụng chức năng này, bạn cần phải cập nhật chức năng này nhiều nơi trong suốt ứng dụng của mình.
- Hiệu suất
- UDF giảm chi phí biên dịch mã T-SQL bằng cách lưu vào bộ nhớ đệm các kế hoạch và sử dụng lại chúng cho các lần thực thi lặp lại. UDF không cần phải được phân tích cú pháp lại và tối ưu hóa lại với mỗi lần sử dụng. Điều này dẫn đến thời gian thực thi nhanh hơn nhiều.
- Lưu lượng mạng giảm
- Một phép toán lọc dữ liệu dựa trên một ràng buộc phức tạp không thể được biểu diễn trong một biểu thức vô hướng đơn có thể được biểu diễn dưới dạng một hàm. Sau đó, hàm có thể được gọi trong
WHERE
để giảm số lượng hàng được gửi đến máy khách.
UDF cũng có thể có những lợi ích khác, cụ thể hơn, như trong ví dụ trước mà tôi đã đề cập với dữ liệu truy cập cột được tính toán trong một bảng khác.
Các loại hàm do người dùng xác định
Có hai loại hàm do người dùng định nghĩa trong T-SQL:
- Hàm vô hướng
- Các hàm vô hướng do người dùng xác định trả về một giá trị dữ liệu duy nhất. Bạn xác định loại giá trị trong hàm. Loại trả về có thể là bất kỳ loại dữ liệu nào ngoại trừ văn bản , ntext , hình ảnh , con trỏ và dấu thời gian .
- Các hàm được định giá trong bảng
- Các hàm có giá trị bảng (TVF) trả về một bảng. Do đó, loại trả lại của họ là bảng . Có hai loại TVF:TVF nội tuyến và TVF đa câu lệnh. TVF nội tuyến không có cơ quan chức năng. Bảng trả về của nó là kết quả của một
SELECT
tuyên bố. Mặt khác, một TVF nhiều câu lệnh, không có một phần thân chức năng. Với TVF nhiều câu lệnh, bạn chỉ định cấu trúc của bảng trong biến trả về.
Bạn cũng có thể tạo các hàm vô hướng và có giá trị bảng dưới dạng các hàm thời gian chạy ngôn ngữ chung (CLR) do người dùng xác định.
Bắt đầu với SQL Server 2005 (9.x), bạn có thể viết các hàm do người dùng xác định bằng bất kỳ ngôn ngữ lập trình Microsoft .NET Framework nào, chẳng hạn như Microsoft Visual Basic .NET hoặc Microsoft Visual C #.