2011-09-13 26 views
1

想象一下以下(非常糟糕)表設計在MSSQL2008R2:如何CSV中從一列在新表中2008年MSSQL拆分行R2

Table "Posts": 
| Id (PK, int) | DatasourceId (PK, int) | QuotedPostIds (nvarchar(255)) | [...] 
|  1  |  1    |        | [...] 
|  2  |  1    |   1     | [...] 
|  2  |  2    |   1     | [...] 
[...] 
| 102322  |  2    |  123;45345;4356;76757  | [...] 

因此,列QuotedPostIds含有分號分隔的列表自我參考PostIds(孩子們,不要在家裏這樣做!)。由於這樣的設計是難看作爲地獄,我想從QuotedPostIds表中的值提取到新N:M關係表是這樣的:

Desired new table "QuotedPosts": 
| QuotingPostId (int) | QuotedPostId (int) | DatasourceId (int) | 
|  2   |  1   |   1   | 
|  2   |  1   |   2   | 
[...] 
|  102322   |  123   |   2   | 
|  102322   |  45345   |   2   | 
|  102322   |  4356   |   2   | 
|  102322   |  76757   |   2   | 

此表的主鍵既可以是組合QuotingPostId,QuotedPostId和DatasourceID或由數據庫生成的附加仿真關鍵字。

值得注意的是,當前的Posts表包含大約6,300,000行,但只有大約285,000個在QuotedPostIds列中設置了值。因此,預先過濾這些行可能是一個好主意。無論如何,如果可能的話,我只想使用內部MSSQL功能來執行規範化。

我已經閱讀了關於這個主題的其他文章,主要涉及到拆分函數,但我也不知道如何創建新表,並從數據源列複製適當的值,也沒有如何過濾觸摸行因此。

謝謝!

€dit:我認爲它通過,並最終解決了問題,使用外部C#程序,而不是內部MSSQL功能。既然看起來可以用Mikael Eriksson的建議來完成,我會把他的帖子標記爲答案。

+0

你可以顯示一些代碼你做了什麼/哪裏有問題嗎?你有什麼問題與拆分?你不會得到一個全功能的解決方案在這裏編碼。 – Jan

+0

我基本上有一個表函數可以從給定的數據行中提取分號分隔的值。我不知道的是如何將它應用到我表中的每一行以及如何將結果添加到新表中。 – Shackles

+0

因爲只有常量和@local_variables可以傳遞給表值函數,所以當你想使用表函數時,你必須聲明一個遊標和步驟到你所有的行。 – Jan

回答

1

從評論你說你有一個字符串拆分功能,你不知道如何使用一個表。

答案是使用cross apply這樣的東西。

select P.Id, 
     S.Value 
from Posts as P 
    cross apply dbo.Split(';', P.QuotedPostIds) as S 
+0

你確定這有效嗎?我已經在網上讀過書,你只能將常量和變量傳遞給表值函數。 – Jan

+1

@Jan:這是APPLY帶來的不同之處。您可以在[BoL文章]中看到類似的示例(http://msdn.microsoft.com/zh-cn/library/ms175156.aspx)。 –

+0

@Andriy:感謝指針 - 很高興知道 – Jan