1

次のようなテーブルUserMasterがあります...(必要な列のみが表示されます)

UserID UserName EmailID
---------------------------------
1000   amol     amol@gmail.com
1001   mahesh   mahesh@gmail.com
1002   saurabh  saurabh@gmail.com
1003   nitesh   nitesh@gmail.com

別の表MessageHistory(必要な列のみが表示されます)

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

と列に保存UserIdsしています...FromTo

Email History特定のメッセージ コードを表示するストアド プロシージャを作成しようとしています。

Create Procedure proc_GetMessageHistory
        @MsgCode varchar(50)
        as
        Begin
           Select * From MessageHistory Where MsgCode=@MsgCode 
        End

結果は上記の表のようになります...しかし、代わりにMessageHistoryそれぞれを表示したい(たとえば、1000の代わりに「amol@gmail.com」)...UserEmailIDsUserID

ストアドプロシージャでこれを行うにはどうすればよいですか? この場合、特にコンマ区切り値で内部結合を使用するにはどうすればよいですか? 助けてください...ありがとう

4

1 に答える 1

1

誰もがすでに指摘しているように、これは決して永続的な解決策であってはなりません。また、そのような非正規化された構造には、さまざまな問題がある可能性があります。それは言った...

メッセージごとの電子メール アドレスのリスト (つまり、行ごとに 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

demo を使用した SQL Fiddle

メッセージのリスト、電子メール アドレスのコンマ区切りリスト、1 行に 1 つのメッセージ:

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

demo を使用した SQL Fiddle

于 2013-03-17T12:11:58.240 に答える