Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Изберете Данни чрез функция с таблично значение в SQL Server

SELECT изразът е може би най-често използваният израз в SQL Server. През повечето време това изявление се изпълнява срещу изглед или директно срещу таблица за извличане на редове с таблични данни.

Но изгледите и таблиците не са единствените обекти, които можете да стартирате с SELECT изявление върху. SELECT операторът може да се използва и за други обекти, като функции за набор от редове, OPENXML и дефинирани от потребителя функции.

Тази статия предоставя пример за избор на данни чрез функция с таблично значение.

Пример 1 – Основна функция

Ето една бърза функция, която избира основни данни от таблица чрез вградена функция със стойност на таблица.

SELECT * FROM udf_Cats_ITVF();

Резултат:

+---------+-----------+------------+
| CatId   | CatName   | Phone      |
|---------+-----------+------------|
| 1       | Garfield  | 9871237654 |
| 2       | Felix     | 8871237651 |
| 3       | Tom       | 7871237652 |
| 4       | Fetch     | 6871237653 |
+---------+-----------+------------+

Функцията изглежда така:

CREATE FUNCTION dbo.udf_Cats_ITVF()
    RETURNS TABLE
AS
RETURN (
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    );
GO

Тази функция просто избира всички редове от таблица. Не се изискват аргументи.

Ако искате да изберете определена котка, трябва да добавите WHERE клауза.

SELECT * FROM udf_Cats_ITVF()
WHERE CatName = 'Fetch';

Резултат:

+---------+-----------+------------+
| CatId   | CatName   | Phone      |
|---------+-----------+------------|
| 4       | Fetch     | 6871237653 |
+---------+-----------+------------+

Сега трябва да призная, че тази функция е някак излишна, защото можехме просто да изберем данните директно от таблицата. Или можехме да създадем изглед, за да свършим работата. Но дефинираните от потребителя функции имат предимство, че таблиците и изгледите нямат:параметри.

Пример 2 – Функция с параметри

Едно от предимствата на функциите с таблично значение е, че поддържат параметри. Тук функцията става малко по-полезна. Някои наричат ​​функциите със стойност на таблицата „параметризирани изгледи“, тъй като те се държат точно като изглед, но с добавената функционалност за разрешаване на параметри.

Така че бихме могли да създадем вариант на предишната функция, за да приемем аргумент за името на котката.

SELECT * FROM udf_CatsByName_ITVF('Fetch');

Резултат:

+---------+-----------+------------+
| CatId   | CatName   | Phone      |
|---------+-----------+------------|
| 4       | Fetch     | 6871237653 |
+---------+-----------+------------+

Новата функция изглежда така:

CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) )
    RETURNS TABLE
AS
RETURN (
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    WHERE CatName = @CatName
    );

GO

Пример 3 – Присъединяване

Функциите с таблично значение могат да бъдат включени в съединения.

Тук избирам всички колони от функция с таблица, която връща всички албуми от даден изпълнител:

SELECT * FROM ufn_AlbumsByArtist(1);

Резултат:

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

Единственият проблем с тази функция е, че не връща името на изпълнителя. Ако искам името на изпълнителя, трябва да го присъединя към таблицата, която съдържа тези данни. В този случай таблицата, която съдържа името на изпълнителя, се нарича Artists , така че мога да променя заявката си, както следва:

SELECT  
    ar.ArtistName,
    aba.AlbumName,
    aba.Genre
FROM ufn_AlbumsByArtist(1) aba
INNER JOIN Artists ar
ON aba.ArtistId = ar.ArtistId;

Резултат:

+--------------+-------------------------+---------+
| 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. Функции срещу съхранени процедури

  2. Как да предам XML от C# към съхранена процедура в SQL Server 2008?

  3. Как да коригирате:JSON_VALUE връща NULL с дълги низове (SQL сървър)

  4. Конфигурация за репликация на транзакции на SQL Server

  5. Мога ли да разгранича няколко реда в една колона със запетая?