2009-02-05 30 views
0

好吧,我正在寫一個針對sql server 2005中的第三方數據庫的報告。大多數情況下,它的規範化除了一個表中的一個字段。他們有一個用戶表(包括組)。這個表有一個用戶ID字段(PK),一個IsGroup字段(位),一個成員字段(文本)這個成員字段有一個逗號分隔的這個組的所有成員列表或者(如果不是組),用逗號分隔這個成員所屬的組的列表。對SQL Server 2005中的CSV字段進行報告DB

問題是編寫一個存儲過程的最佳方式是顯示用戶在哪些組中?我有一個函數將id分析出來。所以最好的辦法是創建一個遊標循環遍歷每個組並解析出用戶標識,將它們寫入臨時表(使用組標識),然後從臨時表中選擇?

用戶表
實施例:
ID | IsGroup |名稱|成員
1個|真|管理| 3
2 |真|電源| 3,4-
3 |假|鮑勃| 1,3
4 |虛假|蘇珊| 2
5 |真|中| 6
6 |虛假|比爾| 5

我希望我的查詢,以顯示: 羣ID |用戶名
1 | 3
2 | 3
2 | 4
5 | 6

希望是有道理的......

回答

0

如果您有(或可以創建)包含組的單獨表格,則可以將其與users表格一起加入,並將它們與charindex函數匹配,並在兩側用逗號填充數據。在部署之前,我會用一些相當極端的工作負載來測試這種方法的性能。然而,它具有獨立和簡單的優點。請注意,將示例更改爲與where子句一起使用交叉連接會生成與此相同的執行計劃。

實例與數據:
SELECT *
FROM   (SELECT 1       AS ID,
               '1,2,3' AS MEMBERS
        UNION
        SELECT 2,
               '2'
        UNION
        SELECT 3,
               '3,1'
        UNION
        SELECT 4,
               '2,1') USERS
       LEFT JOIN (SELECT '1' AS MEMBER
                  UNION
                  SELECT '2'
                  UNION
                  SELECT '3'
                  UNION
                  SELECT '4') GROUPS
         ON CHARINDEX(',' + GROUPS.MEMBER + ',',',' + USERS.MEMBERS + ',') > 0

結果:

 
id members group 
1 1,2,3 1 
1 1,2,3 2 
1 1,2,3 3 
2 2  2 
3 3,1  1 
3 3,1  3 
4 2,1  1 
4 2,1  2 
0

你的技術將可能是最好的方法。

+0

基於一個事實,即SQL Server不解析文本數據非常好。解析未知長度的文本字段的唯一方法是通過循環或光標。 – mrdenny 2009-02-08 21:40:39

+0

這就是我所害怕的。感謝您的幫助。 – user33209 2009-02-09 20:10:03

相關問題