SELECT
câu lệnh có lẽ là câu lệnh được sử dụng phổ biến nhất trong SQL Server. Hầu hết thời gian câu lệnh này được chạy đối với một dạng xem hoặc trực tiếp đối với một bảng để truy xuất các hàng dữ liệu dạng bảng.
Nhưng chế độ xem và bảng không phải là đối tượng duy nhất bạn có thể chạy SELECT
tuyên bố trên. SELECT
câu lệnh cũng có thể được sử dụng trên các đối tượng khác như các hàm tập hợp hàng, OPENXML và các hàm do người dùng định nghĩa.
Bài viết này cung cấp một ví dụ về việc chọn dữ liệu thông qua một hàm có giá trị bảng.
Ví dụ 1 - Hàm cơ bản
Đây là một hàm nhanh chọn dữ liệu cơ bản từ một bảng thông qua một hàm định giá bảng nội tuyến.
SELECT * FROM udf_Cats_ITVF();
Kết quả:
+---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 1 | Garfield | 9871237654 | | 2 | Felix | 8871237651 | | 3 | Tom | 7871237652 | | 4 | Fetch | 6871237653 | +---------+-----------+------------+
Hàm có dạng như sau:
CREATE FUNCTION dbo.udf_Cats_ITVF() RETURNS TABLE AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats ); GO
Chức năng này chỉ cần chọn tất cả các hàng từ một bảng. Không cần đối số.
Nếu muốn chọn một con mèo nhất định, bạn cần thêm WHERE
mệnh đề.
SELECT * FROM udf_Cats_ITVF() WHERE CatName = 'Fetch';
Kết quả:
+---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 4 | Fetch | 6871237653 | +---------+-----------+------------+
Bây giờ tôi phải thừa nhận rằng, chức năng này hơi thừa, bởi vì chúng ta có thể chỉ chọn dữ liệu trực tiếp từ bảng. Hoặc chúng ta có thể tạo một khung nhìn để thực hiện công việc. Nhưng các hàm do người dùng xác định có một lợi ích mà các bảng và chế độ xem không có:tham số.
Ví dụ 2 - Hàm có tham số
Một trong những lợi ích của các hàm có giá trị bảng là chúng hỗ trợ các tham số. Đây là nơi mà chức năng trở nên hữu ích hơn một chút. Một số gọi các hàm có giá trị bảng là "dạng xem được tham số hóa", bởi vì chúng hoạt động giống như dạng xem nhưng có thêm chức năng cho phép tham số.
Vì vậy, chúng tôi có thể tạo một biến thể của hàm trước đó để chấp nhận một đối số cho tên con mèo.
SELECT * FROM udf_CatsByName_ITVF('Fetch');
Kết quả:
+---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 4 | Fetch | 6871237653 | +---------+-----------+------------+
Hàm mới trông giống như sau:
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
Ví dụ 3 - Tham gia
Các hàm có giá trị bảng có thể được đưa vào các phép nối.
Ở đây, tôi chọn tất cả các cột từ một hàm giá trị bảng trả về tất cả các album của một nghệ sĩ nhất định:
SELECT * FROM ufn_AlbumsByArtist(1);
Kết quả:
+------------+-------------------------+---------+ | ArtistId | AlbumName | Genre | |------------+-------------------------+---------| | 1 | Powerslave | Rock | | 1 | Somewhere in Time | Rock | | 1 | Piece of Mind | Rock | | 1 | Killers | Rock | | 1 | No Prayer for the Dying | Rock | +------------+-------------------------+---------+
Vấn đề duy nhất với chức năng này là nó không trả về tên nghệ sĩ. Nếu tôi muốn tên nghệ sĩ, tôi cần nối tên đó với bảng chứa dữ liệu đó. Trong trường hợp này, bảng chứa tên nghệ sĩ được gọi là Artists
, vì vậy tôi có thể sửa đổi truy vấn của mình như sau:
SELECT ar.ArtistName, aba.AlbumName, aba.Genre FROM ufn_AlbumsByArtist(1) aba INNER JOIN Artists ar ON aba.ArtistId = ar.ArtistId;
Kết quả:
+--------------+-------------------------+---------+ | ArtistName | AlbumName | Genre | |--------------+-------------------------+---------| | Iron Maiden | Powerslave | Rock | | Iron Maiden | Somewhere in Time | Rock | | Iron Maiden | Piece of Mind | Rock | | Iron Maiden | Killers | Rock | | Iron Maiden | No Prayer for the Dying | Rock | +--------------+-------------------------+---------+