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

Създайте функция с таблично значение в SQL Server

Можете да създадете функция с таблична стойност (TVF) в SQL Server, като използвате CREATE FUNCTION Синтаксис на T-SQL.

Синтаксисът е малко по-различен в зависимост от това дали създавате вградена функция с таблична стойност (ITVF) или функция с стойност на таблица с множество изрази (MSTVF).

Пример 1 – Вградена функция с таблично стойност

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

CREATE FUNCTION dbo.ufn_AlbumsByGenre_ITVF(@GenreId int)
RETURNS TABLE
AS
RETURN(  
    SELECT 
      ar.ArtistName,
      al.AlbumName,
      g.Genre
    FROM Genres g 
      INNER JOIN Albums al
        ON g.GenreId = al.GenreId 
      INNER JOIN Artists ar 
        ON al.ArtistId = ar.ArtistId
    WHERE g.GenreId = @GenreId
);
GO

Можем да кажем, че това е вградена функция със стойност на таблица, тъй като не посочва структурата на таблицата за връщане. Той просто посочва RETURNS TABLE , след което разчита на SELECT оператор за определяне на структурата на таблицата за връщане.

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

Вижте Създаване на вградена функция с стойност на таблица за примери за добавяне на опции като свързване на схема и криптиране.

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

Пример 2 – Функция с таблична стойност с множество изрази

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

CREATE FUNCTION dbo.ufn_AlbumsByGenre_MSTVF(@GenreId int)
RETURNS @Albums TABLE (
	ArtistName nvarchar(255),
	AlbumName nvarchar(255),
	Genre nvarchar(50)
	)
AS
BEGIN
    INSERT INTO @Albums
    SELECT 
        ar.ArtistName,
        al.AlbumName,
        g.Genre
    FROM Genres g 
        INNER JOIN Albums al
        ON g.GenreId = al.GenreId 
        INNER JOIN Artists ar 
        ON al.ArtistId = ar.ArtistId
    WHERE g.GenreId = @GenreId

    RETURN
END
GO

В този случай използваме променлива от тип таблица наречен @Albums и ние изрично указваме структурата на таблицата за връщане. Резултатите от заявката се съхраняват в тази променлива, която след това се връща при извикване на функцията.

Едно от предимствата на MSTVF е, че те могат да съдържат множество изявления. Ето го отново с добавена допълнителна част в края.

CREATE FUNCTION dbo.ufn_AlbumsByGenre_MSTVF(@GenreId int)
RETURNS @Albums TABLE (
	ArtistName nvarchar(255),
	AlbumName nvarchar(255),
	Genre nvarchar(50)
	)
AS
BEGIN
    INSERT INTO @Albums
    SELECT 
        ar.ArtistName,
        al.AlbumName,
        g.Genre
    FROM Genres g 
        INNER JOIN Albums al
        ON g.GenreId = al.GenreId 
        INNER JOIN Artists ar 
        ON al.ArtistId = ar.ArtistId
    WHERE g.GenreId = @GenreId
 
    IF @@ROWCOUNT = 0
    BEGIN
        INSERT INTO @Albums
        VALUES (
            'None',
            'None',
            'None'
            )
    END

    RETURN
END
GO

Вижте Създаване на функция с таблично стойности с множество изрази за примери за добавяне на опции като свързване на схема и криптиране.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да деактивирате улавянето на промяна на данни (CDC) в база данни в SQL Server - урок за SQL Server

  2. Как да заявя стойности от xml възли?

  3. Как да използвам променлива за името на базата данни в T-SQL?

  4. Достигане на ограничението от 2100 параметър (SQL Server) при използване на Contains()

  5. Как да се свържете с база данни от Unity