SQL Server 2005 - Select语句中的表函数

时间:2009-05-22 05:58:45

标签: sql sql-server-2005

我有一个名为PurchaseOrderDetail的表。

TABLE PurchaseOrderDetail
 PurchaseOrderDetail int,
 Comments nvarchar(500)

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

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

我还有一个名为Split的函数,它接受一个分隔符和一个字符串并返回一个表,

所以叫这个 从分割中选择*(';','Microsoft Office Standard 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%

是否可能,或者我是以错误的方式解决这个问题

2 个答案:

答案 0 :(得分: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子句。

答案 1 :(得分:0)

表格可以包含多于一列的原因。这是一个痛苦,但总是从一个共同的列中分割出来的价值!

  • 改变你的表格
  • 为您的数据添加专用列
  • 更新并加入CROSS APPLY以拆分每一行并填充新列
  • 删除包含多个数据元素的旧列
  • 升级保存并加载例程以使用新列
  • 从不担心再次分割数据!