1

我有一個表UserMaster如下......(僅列所示)使用內部連接上逗號分隔值存儲過程

UserID UserName EmailID 
--------------------------------- 
1000 amol  [email protected] 
1001 mahesh [email protected] 
1002 saurabh [email protected] 
1003 nitesh [email protected] 

另一個表MessageHistory(僅列所示)

MsgCode From To 
----------------------------- 
MSG001 1000 1001,1002,1003 
MSG002 1001 1000,1002,1003 

我在FromTo列存儲UserIds ...

我一個米試圖創建一個存儲步驟,顯示的特定的消息代碼Email History

Create Procedure proc_GetMessageHistory 
     @MsgCode varchar(50) 
     as 
     Begin 
      Select * From MessageHistory Where [email protected] 
     End 

結果來作爲MessageHistory表如上所示...但我要顯示的各UserEmailIDs代替UserID(例如'[email protected]'而不是1000)...

我怎麼能在存儲過程中做到這一點?我怎麼能在這種情況下使用內部連接,特別是用逗號分隔的值?請幫助......謝謝

+5

**不要**使用逗號分隔值 - 這是**糟糕的設計**,總是會是一團糟和一個可怕的黑客使用。你需要使用**正確的規範化**數據庫表 - 然後一個JOIN將是一個沒有問題的... – 2013-03-17 09:11:43

+0

是的我同意..這將是這個改變DB結構的最終解決方案...但isn沒有辦法做到這一點,沒有這樣做? – 2013-03-17 09:19:53

+0

有一些可怕的,瘋狂的凌亂的黑客 - 我寧願不去想那些,雖然.....(不寒而慄) – 2013-03-17 09:35:46

回答

1

正如大家已經注意到的,這絕不應該是任何永久性的解決方案,因爲它不會以有效的方式執行。此外,這種非規範化結構可能會有許多問題。每個郵件的電子郵件地址也就是說......

表,即每行一個收件人:

select m.MsgCode 
    , sender = s.EmailID 
    , recipient = u.EmailID 
from MessageHistory m 
    inner join UserMaster s on m.[From] = s.UserID 
    inner join UserMaster u on charindex(cast(u.UserID as varchar), m.[To]) > 0 

SQL Fiddle with demo。消息

列表,以逗號分隔的電子郵件地址列表,每行一個消息:

with emails as 
(
    select m.MsgCode 
    , recipient = u.EmailID 
    from MessageHistory m 
    inner join UserMaster u on charindex(cast(u.UserID as varchar), m.[To]) > 0 
) 
select m.MsgCode 
    , [From] = u.EmailID 
    , [To] = stuff 
    (
     (
     select ',' + recipient 
     from emails e 
     where m.MsgCode = e.MsgCode 
     for xml path('') 
    ) 
     , 1 
     , 1 
     , '' 
    ) 
from MessageHistory m 
    inner join UserMaster u on m.[From] = u.UserID 

SQL Fiddle with demo

+0

上述評論後,我改變了結構DB ...雖然我會試着理解和實現這個代碼...它對我的新學習...謝謝你的努力...... + 1 :) – 2013-03-17 14:48:16