我有一个名为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%
是否可能,或者我是以错误的方式解决这个问题
答案 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)
表格可以包含多于一列的原因。这是一个痛苦,但总是从一个共同的列中分割出来的价值!