2009-05-22 56 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