Kullanarak UYGULA

apply işleç bir dış tablo ifade bir sorgu tarafından döndürülen her satır için tablo değerli işlev çağırmak izin verir.Tablo değerli işlev sağ girdi olarak davranır ve dış tablo ifade sol giriş olarak davranır.Giriş sağ sol giriş gelen her satır için değerlendirilir ve son çıktı için üretilen satır birleştirilir.apply işleç tarafından üretilen sütunlar listesinde küme sağ giriş tarafından döndürülen sütunlar listesi ve ardından sol giriş sütun.

Not

UYGULA kullanmak için veritabanı uyumluluk düzey 90 en az olmalıdır.

UYGULA'ın iki biçimi vardır: Çapraz apply ve dış uygulayın.apply verir dış gelen tek satır tablo değerli işlev ' bir sonuç küme, üretim tablosu.Dış uygulamak, bir sonuç küme üretmek satırları hem tablo değerli işlev tarafından üretilen sütunlardaki null değerleri ile bulunmayan satırları döndürür.

Örnek olarak, aşağıdaki tablolarda göz önünde Employees ve Departments:

--Create Employees table and insert values.
CREATE TABLE Employees
(
    empid   int         NOT NULL
    ,mgrid   int         NULL
    ,empname varchar(25) NOT NULL
    ,salary  money       NOT NULL
    CONSTRAINT PK_Employees PRIMARY KEY(empid)
);
GO
INSERT INTO Employees VALUES(1 , NULL, 'Nancy'   , $10000.00);
INSERT INTO Employees VALUES(2 , 1   , 'Andrew'  , $5000.00);
INSERT INTO Employees VALUES(3 , 1   , 'Janet'   , $5000.00);
INSERT INTO Employees VALUES(4 , 1   , 'Margaret', $5000.00);
INSERT INTO Employees VALUES(5 , 2   , 'Steven'  , $2500.00);
INSERT INTO Employees VALUES(6 , 2   , 'Michael' , $2500.00);
INSERT INTO Employees VALUES(7 , 3   , 'Robert'  , $2500.00);
INSERT INTO Employees VALUES(8 , 3   , 'Laura'   , $2500.00);
INSERT INTO Employees VALUES(9 , 3   , 'Ann'     , $2500.00);
INSERT INTO Employees VALUES(10, 4   , 'Ina'     , $2500.00);
INSERT INTO Employees VALUES(11, 7   , 'David'   , $2000.00);
INSERT INTO Employees VALUES(12, 7   , 'Ron'     , $2000.00);
INSERT INTO Employees VALUES(13, 7   , 'Dan'     , $2000.00);
INSERT INTO Employees VALUES(14, 11  , 'James'   , $1500.00);
GO
--Create Departments table and insert values.
CREATE TABLE Departments
(
    deptid    INT NOT NULL PRIMARY KEY
    ,deptname  VARCHAR(25) NOT NULL
    ,deptmgrid INT NULL REFERENCES Employees
);
GO
INSERT INTO Departments VALUES(1, 'HR',           2);
INSERT INTO Departments VALUES(2, 'Marketing',    7);
INSERT INTO Departments VALUES(3, 'Finance',      8);
INSERT INTO Departments VALUES(4, 'R&D',          9);
INSERT INTO Departments VALUES(5, 'Training',     4);
INSERT INTO Departments VALUES(6, 'Gardening', NULL);

Çoğu departmanları Departments Tablo sahip bir çalışana karşılık gelen bir Yöneticisi kimlik Employees tablosu.Aşağıdaki tablo değerli işlev bir çalışan kimliği bağımsız değişken olarak kabul eder ve bu çalışan ve tüm kendi alt döndürür.

CREATE FUNCTION dbo.fn_getsubtree(@empid AS INT) 
    RETURNS @TREE TABLE
(
    empid   INT NOT NULL
    ,empname VARCHAR(25) NOT NULL
    ,mgrid   INT NULL
    ,lvl     INT NOT NULL
)
AS
BEGIN
  WITH Employees_Subtree(empid, empname, mgrid, lvl)
  AS
  ( 
    -- Anchor Member (AM)
    SELECT empid, empname, mgrid, 0
    FROM Employees
    WHERE empid = @empid

    UNION all
    
    -- Recursive Member (RM)
    SELECT e.empid, e.empname, e.mgrid, es.lvl+1
    FROM Employees AS e
      JOIN Employees_Subtree AS es
        ON e.mgrid = es.empid
  )
  INSERT INTO @TREE
    SELECT * FROM Employees_Subtree;

  RETURN
END
GO

Tüm alt tüm düzeyler için her bölüm Yöneticisi geri dönmek için aşağıdaki sorgu kullanın.

SELECT D.deptid, D.deptname, D.deptmgrid
    ,ST.empid, ST.empname, ST.mgrid
FROM Departments AS D
    CROSS APPLY fn_getsubtree(D.deptmgrid) AS ST;

Sonuç kümesi buradadır.

deptid      deptname   deptmgrid   empid       empname    mgrid       lvl
----------- ---------- ----------- ----------- ---------- ----------- ---
1           HR         2           2           Andrew     1           0
1           HR         2           5           Steven     2           1
1           HR         2           6           Michael    2           1
2           Marketing  7           7           Robert     3           0
2           Marketing  7           11          David      7           1
2           Marketing  7           12          Ron        7           1
2           Marketing  7           13          Dan        7           1
2           Marketing  7           14          James      11          2
3           Finance    8           8           Laura      3           0
4           R&D        9           9           Ann        3           0
5           Training   4           4           Margaret   1           0
5           Training   4           10          Ina        4           1

Dikkat her satırdan Departments Tablo değişkeni çoğaltılmış kadar tarafından döndürülen satır olarak fn_getsubtree departmanın Yöneticisi.

Ayrıca, Gardening bölüm görünmez sonuçlar.Bu bölüm, yönetici olduğu için fn_getsubtree döndürülen bir boş küme programıKullanarak OUTER APPLY, Gardening bölüm de görünür sonuç küme null değerleri ile deptmgrid alan, aynı zamanda gibi alanlarda tarafından döndürülen fn_getsubtree.

Ayrıca bkz.

Başvuru