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

相关问题