对于每个零售店,我们都希望调用 GetProximity 并找出五台最近的 ATM。在 SQL Server 2005 中,有一个新的 APPLY 子句类型可处理此问题。这与联接稍有不同,因为我们希望联接函数参数,而不是函数结果。这意味着表值函数是为 APPLY 左侧返回的每一行调用的。然后,就可以将函数结果的并集联接到该查询的其余部分。以下是该报表数据集的 Transact-SQL 查询: 
SELECT TOP(40) Sales.Store.Name, Person.Address.City,
   Person.StateProvince.StateProvinceCode, GetProximity_1.HitName,
   GetProximity_1.HitAddress, GetProximity_1.MapImage
   FROM Sales.CustomerAddress
      INNER JOIN Person.Address
         ON Sales.CustomerAddress.AddressID = Person.Address.AddressID
         AND Sales.CustomerAddress.AddressID = Person.Address.AddressID
      INNER JOIN Sales.Store
      INNER JOIN Sales.StoreContact ON Sales.Store.CustomerID = 
Sales.StoreContact.CustomerID
         ON Sales.CustomerAddress.CustomerID = 
Sales.StoreContact.CustomerID
      INNER JOIN Person.StateProvince ON Person.Address.StateProvinceID 
= Person.StateProvince.StateProvinceID
         AND Person.Address.StateProvinceID = 
Person.StateProvince.StateProvinceID
CROSS APPLY dbo.GetProximity(Person.Address.City,
   Person.StateProvince.StateProvinceCode, 5, "SIC3578") AS 
GetProximity_1  | 
请注意,其中使用了 CROSS APPLY 来将 GetProximity 函数参数与 Person.Address.City 和 Person.StateProvince.StateProvinceCode 表示的其他查询数据进行链接。 
注意 若要在数据集查询中使用 APPLY 子句,必须使用通用查询设计器。基于 GUI 的查询设计器不能以图形方式显示它,并会引发异常。 
我的报表设计使用两个嵌套的列表。内部列表包含用于 ATM 名称和地址的文本框,以及地图的图像。在我的报表中,此图像设置为 AutoSize,因此它会根据 Web 服务中的图像的大小而调整。外部列表包含用于零售店的名称和位置的文本框。外部列表按零售店名称进行分组。我的报表在布局模式下的图像如图 3 所示。 
图 3. 布局模式下的报表图像
图 4 显示绘制有 ATM 位置图的报表
结论 
本白皮书说明了如何使用 SQL Server 中的表值函数来扩展 SQL Server Reporting Services 的数据访问功能。表值函数让编程人员和报表设计员有一定的灵活性,使他们能够实现数据不直接存储在数据库表中的报表制作场景。