Welcome to Sign in | Help
in Search

operatorul cross apply

Last post 08-01-2008, 10:25 AM by crestinul. 4 replies.
Sort Posts: Previous Next
  •  07-31-2008, 5:38 PM 5405

    operatorul cross apply

    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


    Secolul XXI ori va fi religios ori nu va fi deloc
  •  07-31-2008, 5:48 PM 5406 in reply to 5405

    Re: operatorul cross apply

    Ce nu intelegi din exemplul BOL?

    Vezi daca http://www.sqlteam.com/article/using-cross-apply-in-sql-server-2005 ti se pare mai clar...

  •  07-31-2008, 7:22 PM 5408 in reply to 5405

    Re: operatorul cross apply

  •  07-31-2008, 7:30 PM 5409 in reply to 5405

    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

  •  08-01-2008, 10:25 AM 5414 in reply to 5409

    Re: operatorul cross apply

    Multumesc mult tutoror in special llui Bigdan m-am mai lamurit si eu ,finally Smile
    Secolul XXI ori va fi religios ori nu va fi deloc
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems