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

Chọn dữ liệu thông qua một chức năng được định giá bằng bảng trong SQL Server

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. UPSERT nguyên tử trong SQL Server 2005

  2. Cải thiện điều chỉnh hiệu suất SQL Server với 3 mẹo sau

  3. Cách trả lại tất cả các ràng buộc khóa ngoại bị vô hiệu hóa trong SQL Server (Ví dụ T-SQL)

  4. Cách tạo trường tăng tự động trong truy vấn chọn

  5. Khóa ngoại cho nhiều bảng