2009-05-22 74 views
2

我有一个名为PurchaseOrderDetail的表。SQL Server 2005 - Select语句中的表函数

TABLE PurchaseOrderDetail 
PurchaseOrderDetail int, 
Comments nvarchar(500) 

在每个项目的注释字段我有一个“;”是存储合同名称,合同号,许可证名称,许可证版本分隔的列表。

PurchaseOrderDetail  Comments 
1      'Microsoft Office Standard 2007;12%;;' 
2      'Microsoft Visio 2007;9%;;' 

我也有一个功能叫做拆分,需要一个分隔符和一个字符串,并返回一个表,

所以调用此 SELECT * FROM斯普利特(“;”,“微软Office标准版2007; 12%;;“)

返回此

pn   s [ column names] 
1   Microsoft Office Standard 2007 
2   12% 

我要打破这种信息对每个PurchaseOrderDetail,并显示他们在一份报告中

因此,像这样

select PurchaseOrderDetailID, cn.s as ContractName, cno.s as ContractNo 
from dbo.PurchaseOrderDetail as pod 
join dbo.Split(';', pod.Comments) as cn on cn.pn = 1 
join dbo.Split(';', pod.Comments) as cno on cno.pn = 2 

虽然不运行,但我希望它表明意图。

我想我的结果是:

PurchaseOrderDetailID ContractName     ContractNo 
1      Microsoft Office Standard 2007 12% 

是否有可能,还是我处理这个错误的方式

回答

3

你“加入”使用apply关键字表值函数。只需将您的字段传递给函数,而不是使用“ON”链接表达式。来自MSDN的示例:

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; 

OUTER APPLY相当于LEFT JOIN。

编辑

在您的例子,你可以应用功能后添加 “CN = 1” 和 “CN = 2” 的标准作为一个WHERE子句。

+0

感谢马特,如果你找到自己的方式进入墨尔本的某个时候,我们将不得不给你一个啤酒 – Jiminy 2009-05-22 06:14:55

0

表格可以有多于一列的原因是有原因的。这是一种痛苦,但始终将价值分割出一个共同的列。

  • 改变你的表
  • 添加专用的列数据
  • UPDATE FROM和交叉联接APPLY分割每一行和填充新列
  • 删除包含多个数据旧列元素
  • 升级您的保存和加载例程以使用新列
  • 不用担心再次拆分数据!
+0

KM你是对的,如果这个选项对我有用,我会接受它。但是即使你愿意,有时你也不能改变模式。不过,我认为我会创建一个视图,使得使用此表的查询更易于编写。 – Jiminy 2009-05-24 23:15:33