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.