图3:在TableAdapter向导里创建新的存储过程
接下来,如图4所示,向导询问我们添加的是那种类型的查询,由于GetProductsWithPriceQuartile方法将返回Products表的所有记录以及所有列,我们选择“SELECT which returns rows”项,再点Next.
图4:查询将是一个返回多个行的SELECT Statement
接下来,我们在向导里键入如下的查询:
SELECT ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued, NTILE(4) OVER (ORDER BY UnitPrice DESC) as PriceQuartile FROM Products
上述查询使用了SQL Server 2005新增的NTILE function函数,它将结果划分为4组,将UnitPrice值按降序分组.
不幸的是,查询构造器(Query Builder)不能解析关键字OVER,并抛出一个错误信息。因此,直接在向导的文本框里键入上述代码,而不要使用查询构造器.
注意:关于NTILE以及SQL Server 2005的其它函数的更多信息,你可参阅文章《Returning Ranked Results with Microsoft SQL Server 2005》()以及SQL Server 2005 Books Online的《Ranking Functions section》部分()
完成后,点Next, 向导将要我们为新存储过程重命名,我们取名为Products_SelectWithPriceQuartile再点Next.
图5:将新存储过程命名为Products_SelectWithPriceQuartile
最后我们要为TableAdapter的方法命名,选中“Fill a DataTable” 和 “Return a DataTable”两项,并重命名为 FillWithPriceQuartile 和GetProductsWithPriceQuartile.
图6:对TableAdapter的方法命名并点Finish
当指定了SELECT查询,并对存储过程和TableAdapter的方法命名后,点Finish完成向导。这时你将看到1到2条警告信息,说“The OVER SQL construct or statement is not supported.” 不必理会它.
完成向导后,该TableAdapter将会包含FillWithPriceQuartile 和GetProductsWithPriceQuartile方法,并且数据库将包含一个名为Products_SelectWithPriceQuartile的存储过程。花点时间来验证一下,检查数据库,如果你没有看到我们刚添加的存储过程,在存储过程文件夹上右键单击,选“刷新”.
图7:验证新方法是否添加到TableAdapter
图8:确保数据库包含Products_SelectWithPriceQuartile存储过程
注意:使用存储过程来替换ad-hoc SQL statements的好处之一是重新运行TableAdapter设置向导的话并不会改动存储过程返回的列.我们可以作一个验证,在TableAdapter上右键单击,选“Configure”项,以启动向导,然后点Finish完成向导。接下来,我们在数据库里查看Products_SelectWithPriceQuartile存储过程.我们注意到其返回的列并没有发生变化.如果我们使用的是ad-hoc SQL statements的话,重新运行向导将会使查询返回的列与主查询的列相匹配,因此它将把GetProductsWithPriceQuartile方法里使用的查询里的NTILE statement删除掉.
当调用数据访问层的GetProductsWithPriceQuartile方法时,TableAdapter将执Products_SelectWithPriceQuartile存储过程,并为返回的每条记录向ProductsDataTable添加对应的row.存储过程返回的数据域(data fields)将映射到ProductsDataTable的列.因为该存储过程要返回一个PriceQuartile数据域,所以它的值将分配给ProductsDataTable的PriceQuartile列.