Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Utwórz funkcję wartościującą tabelę w SQL Server

Funkcję z wartościami przechowywanymi w tabeli (TVF) można utworzyć w programie SQL Server przy użyciu CREATE FUNCTION Składnia T-SQL.

Składnia jest nieco inna w zależności od tego, czy tworzysz wbudowaną funkcję z wartościami tabelarycznymi (ITVF), czy wieloinstrukcyjną funkcję z wartościami tabelarycznymi (MSTVF).

Przykład 1 — Wbudowana funkcja z wartościami tabelarycznymi

Oto przykład wbudowanej funkcji z wartościami tabelarycznymi.

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

Możemy powiedzieć, że jest to wbudowana funkcja z wartościami tabelarycznymi, ponieważ nie określa struktury tabeli zwracanej. Po prostu stwierdza RETURNS TABLE , a następnie polega na SELECT instrukcja do określenia struktury tabeli zwrotów.

W takim przypadku funkcja wymaga przekazania identyfikatora gatunku jako argumentu.

Zobacz Tworzenie wbudowanej funkcji z wartościami przechowywanymi w tabeli, aby zapoznać się z przykładami dodawania opcji, takich jak powiązanie schematu i szyfrowanie.

Wiązanie schematu jest zwykle dobrym pomysłem, ponieważ zapobiega wprowadzaniu niepożądanych zmian w podstawowych obiektach, do których odwołuje się funkcja.

Przykład 2 – Wielowyrazowa funkcja z wartościami tabelarycznymi

Oto, jak napisalibyśmy funkcję, gdybyśmy chcieli, aby była to wieloinstrukcyjna funkcja z wartościami w tabeli.

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

W tym przypadku używamy zmiennej typu tabela o nazwie @Albums i wyraźnie określamy strukturę tabeli zwrotów. Wyniki zapytania są przechowywane w tej zmiennej, która jest następnie zwracana po wywołaniu funkcji.

Jedną z zalet MSTVF jest to, że mogą zawierać wiele instrukcji. Tutaj znowu z dodatkową częścią dodaną na końcu.

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

Zobacz Tworzenie funkcji wielowyrazowej z wartościami przechowywanymi w tabeli, aby zapoznać się z przykładami dodawania opcji, takich jak powiązanie schematu i szyfrowanie.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaki jest najlepszy sposób automatycznego generowania instrukcji INSERT dla tabeli programu SQL Server?

  2. SQL Server Konwertuj Varchar na Datetime

  3. Wybierz oświadczenie, aby znaleźć duplikaty w określonych polach

  4. Jak automatycznie wygenerować unikalny identyfikator w SQL, taki jak UID12345678?

  5. Skalarne wstawianie UDF w SQL Server 2019