crestinul: Buna ziua,
Am incercat sa inteleg cum functioneaza acest operator dar nu am inteles.Imi puteti explica va rog ,eventua un scenariu in care sa fie folosit ,l-at folosit in proiecte reale in productie?
Multumesc
Exemplu teoretic:
CREATE TABLE T
(
Nr INT NOT NULL,
Caracter CHAR(1) NOT NULL
);
GO
INSERT INTO T VALUES (0,'-');
INSERT INTO T VALUES (1,'A');
INSERT INTO T VALUES (2,'B');
INSERT INTO T VALUES (3,'C');
INSERT INTO T VALUES (0,'=');
GO
--Functia genereaza un set de inregistrari
--care contine un numar de inregistrari (linii)
--egal cu valoarea @parametru[ului].
--Deci daca @parametru[l] are valoarea 2 atunci dbo.F(2) genereaza un set de 2 inregistrari.
--Daca @parametru[l] are valoarea 0 atunci dbo.F(0) nu genereaza inregistrari.CREATE FUNCTION dbo.F(@parametru INT)
RETURNS @rezultat TABLE (Camp1 INT)
AS
BEGIN
DECLARE @i INT
SET @i = 1
WHILE ( @i <= @parametru )
BEGIN
INSERT INTO @rezultat VALUES ( @i*10 )
SET @i = @i + 1
END
RETURN
END;
GO
--Query1
SELECT T.*, FN.*
FROM T CROSS APPLY dbo.F(T.Nr) AS FN
--Query2
SELECT T.*, FN.*
FROM T OUTER APPLY dbo.F(T.Nr) AS FN
GO
Rezultate:
--Query1
1 A 10
2 B 10
2 B 20
3 C 10
3 C 20
3 C 30
--Query2
0 - NULL -- <= dbo.F nu a generat nici o inregistrare pentru dbo.F(0) deci se afiseaza NULL
1 A 10
2 B 10
2 B 20
3 C 10
3 C 20
3 C 30
0 = NULL -- <= dbo.F nu a generat nici o inregistrare pentru dbo.F(0) deci se afiseaza NULL
Intr-un fel, CROSS APPLY permite joncţiunea tip INNER JOIN (desi, poate ca unii ar zice CROSS JOIN) a înregistrărilor dintr-o sursă (inclusiv o funcţie ...) cu înregistrările generate de o funcţie T-SQL tip TABLE (si nu numai) , condiţia de joncţiune fiind
inclusă în funcţia din dreapta joncţiunii.
Oarecum, OUTER APPLY permite joncţiunea tip LEFT OUTER JOIN a înregistrărilor dintr-o
sursă cu înregistrările generate de o funcţie T-SQL tip TABLE (si nu numai) ,
condiţia de joncţiune fiind
inclusă în funcţia din dreapta joncţiunii.
+
CREATE FUNCTION dbo.fT()
RETURNS TABLE
RETURN (SELECT Nr, Caracter
FROM
(
SELECT 0 AS Nr,'-' AS Caracter
UNION
SELECT 1,'A'
UNION
SELECT 2,'B'
UNION
SELECT 3,'C'
UNION
SELECT 0,'='
) AS Q)
--Query3
SELECT T.*, FN.*
FROM dbo.fT() AS T CROSS APPLY dbo.F(T.Nr) AS FN
--Query4
SELECT T.*, FN.*
FROM dbo.fT() AS T OUTER APPLY dbo.F(T.Nr) AS FN
De asemenea vezi ce rezultate obtii în urmatoarele exemple:
--Query5 (unde T este tabela de mai sus)
SELECT *
FROM dbo.fT() AS A CROSS APPLY T AS B
--Query6
SELECT *
FROM dbo.fT() AS A OUTER APPLY T AS B