APPLY'ı kullanma
Tablo değerli gerektiðinde APPLY işleç sağlar işlev dış tablo ifade bir sorgu tarafından döndürülen her satır için.tablo değerli işlev sağ giriş olarak davranır ve dış tablo ifade sol giriş olarak davranır.Doğru giriş, sol giriş gelen her satır için değerlendirilir ve son çıktı için oluşturulan satırları bir araya getirilir.APPLY işletmeni tarafından oluşturulan sütun listesi küme ardından doğru girişi tarafından döndürülen sütunlar listesi giriş sol sütun.
Not
APPLY'ı kullanmak için , veritabanını uyumluluk düzey 90 en az olmalıdır.
APPLY'ın iki biçimi vardır: Çapraz APPLY ve OUTER APPLY. APPLY bir sonuç üreten dış tablodan yalnızca satır döndürür küme tablo değerli işlevi.Bir sonuç üreten iki satır OUTER APPLY'ı verir küme ve tablo değerli işlev tarafından üretilen sütunlardaki NULL değerleri olan bulunmayan satırlar.
Örneğin, aşağıdaki tablolarda, göz önünde bulundurun. 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 bölümleri, Departments tablonuz karşılık gelen bir çalışan için bir yönetici KIMLIĞI Employees TABLO. 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 düzeyindekilerin 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 düzeyindekilerin yöneticisinin her bölüm için tüm düzeyler 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;
Here is the result set.
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
Fark her satırdan Departments Tablo olarak döndürülen satırları gibi birçok kez yineleniyor fn_getsubtree departmanın yöneticisini.
Ayrıca, Gardening Departman görünmüyor sonuçlar. Bu bölüm, yok bir Yöneticisi olduğundan fn_getsubtree boş bir iade küme onun için. Kullanarak OUTER APPLY, Gardening bölüm null değer içeren de sonuç kümesinde görüntülenir deptmgrid aynı zamanda tarafından döndürülen alanlarındaki olarak alanının fn_getsubtree.