Når du opretter en table-valued function (TVF) i SQL Server, kan du enten gøre den til en inline table-valued function (ITVF) eller en multi-statement table-valued funktion (MSTVF). Der er forskelle mellem disse funktionstyper, og de bruger en anden syntaks i overensstemmelse hermed.
Denne artikel dækker forskellen mellem MSTVF'er og ITVF'er.
Forskellene
Her er de vigtigste forskelle mellem MSTVF'er og ITVF'er.
| ITVF | MSTVF | |
|---|---|---|
| RETURNS-syntaksen | Du angiver blot RETURNS TABLE og returtabellens definition vil være baseret på funktionens SELECT udmelding. Det er ikke nødvendigt at angive strukturen af returtabellen. | Dine RETURNS syntaks angiver eksplicit strukturen af returtabellen. Dette gøres ved at erklære en TABLE-variabel, der vil blive brugt til at gemme og akkumulere de rækker, der returneres som værdien af funktionen. |
| BEGIN/SLUT-syntaksen | ITVF'er bruger ikke BEGIN /END syntaks. | MSTVF'er bruger BEGIN /END syntaks. |
| Ydeevne | Generelt hurtigere end MTSVF'er. | Generelt langsommere end ITVF'er. |
| Dataopdateringer | I nogle tilfælde er det muligt at opdatere data i de underliggende tabeller ved hjælp af en ITFV. | Du kan ikke opdatere data i de underliggende tabeller ved hjælp af en MSTVF. |
Syntaks
Lad os se på forskellene i syntaksen for hver funktionstype.
Inline-tabel-vurderet funktion
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type
[ = default ] [ READONLY ] }
[ ,...n ]
]
)
RETURNS TABLE
[ WITH <function_option> [ ,...n ] ]
[ AS ]
RETURN [ ( ] select_stmt [ ) ]
[ ; ]
Multi-Statement Table-Valued Funktion
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type
[ = default ] [READONLY] }
[ ,...n ]
]
)
RETURNS @return_variable TABLE <table_type_definition>
[ WITH <function_option> [ ,...n ] ]
[ AS ]
BEGIN
function_body
RETURN
END
[ ; ]
Bemærk, at MSTVF starter med en tabeldefinition, men ITVF har ingen sådan definition.
MSTVF starter med RETURNS @return_variable TABLE efterfulgt af tabeldefinitionen. Her, @return_variable er en TABLE-variabel, der bruges til at gemme og akkumulere de rækker, der skal returneres som værdien af funktionen.
Eksempel 1 – Inline-tabel-vurderet funktion
Her er et eksempel på en simpel ITVF.
CREATE FUNCTION udf_PetsByName_ITVF( @PetName varchar(70))
RETURNS TABLE
AS
RETURN (
SELECT
CONCAT('Cat', ' ', CatId) AS PetId,
CatName
FROM dbo.Cats
WHERE CatName = @PetName
UNION ALL
SELECT
CONCAT('Dog', ' ', DogId) AS PetId,
DogName
FROM dbo.Dogs
WHERE DogName = @PetName
);
GO
Her vælger jeg fra to tabeller ved hjælp af UNION ALL , og funktionen returnerer blot resultatet.
Eksempel 2 – Multi-erklærings-tabel-værdi-funktion
Her er et eksempel på at bruge en MTVF til at gøre det samme, men på en anden måde.
CREATE FUNCTION udf_PetsByName_MSTVF( @PetName varchar(70))
RETURNS @pets TABLE (
PetId varchar(20),
PetName varchar(70)
)
AS
BEGIN
INSERT INTO @pets
SELECT
CONCAT('Cat', ' ', CatId),
CatName
FROM dbo.Cats
WHERE CatName = @PetName;
INSERT INTO @pets
SELECT
CONCAT('Dog', ' ', DogId),
DogName
FROM dbo.Dogs
WHERE DogName = @PetName;
RETURN;
END;
GO
Funktionen starter med at erklære en TABLE-variabel kaldet @pets . Ved at gøre dette specificerer vi eksplicit strukturen af returtabellen.
Forespørgslerne i BEGIN /END blok gemmes i TABLE-variablen kaldet @pets .
I dette tilfælde valgte jeg ikke at bruge UNION ALL . I stedet udførte jeg sætningerne separat og gemte resultaterne af hver enkelt i @pets variabel.
Eksempel 3 – Tilføj endnu en erklæring til MSTVF
For yderligere at demonstrere "multi-statement"-aspektet af MSTVF'er kan vi tilføje flere sætninger til ovenstående MSTVF og gemme resultaterne i den samme returneringsvariabel.
Eksempel:
CREATE FUNCTION udf_PetsByName_MSTVF( @PetName varchar(70))
RETURNS @pets TABLE (
PetId varchar(20),
PetName varchar(70)
)
AS
BEGIN
INSERT INTO @pets
SELECT
CONCAT('Cat', ' ', CatId),
CatName
FROM dbo.Cats
WHERE CatName = @PetName;
INSERT INTO @pets
SELECT
CONCAT('Dog', ' ', DogId),
DogName
FROM dbo.Dogs
WHERE DogName = @PetName;
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO @pets
VALUES (
'',
'There are no pets of that name.'
)
END
RETURN;
END;
GO
I dette tilfælde tilføjede jeg noget kode for at returnere en speciel besked, når forespørgslen resulterer i, at der ikke returneres rækker.