Welcome to Sign in | Help

Re: operatorul cross apply

  •  07-31-2008, 7:30 PM

    Re: operatorul cross apply

    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

View Complete Thread
Powered by Community Server (Commercial Edition), by Telligent Systems