【问题标题】:StoredProcedure which return some records and Insert for each of them a row in a tableStoredProcedure 返回一些记录并为每个记录插入表中的一行
【发布时间】:2014-05-16 12:19:59
【问题描述】:

我正在使用这个Schema 在带有 SQLServer 2012 数据库的 asp.net MVC 4 应用程序中创建消息系统。

现在我有 2 个问题。当我从线程对话中选择所有消息时,我应该在 MessageReadyState 表中插入一条记录。

这是我通过 ThreadId 获取消息的存储过程

  SELECT TOP(@NumberMessage)
  Message.MessageId
, Message.CreateDate
, Message.Body,Person.Name , Person.Surname,Utente.ID,MessageThread.MessageThreadId as MessageThreadID
, [User].Username,User.[Path] , Person.Image
, (SELECT MessageReadState.ReadDate 
   FROM MessageReadState 
   WHERE MessageReadState.MessageId = Message.MessageId 
     and MessageReadState.UserId = @UserId) as ReadState
FROM (Message INNER JOIN [Utente] ON Message.SenderUserId = [Utente].ID 
       INNER JOIN MessageThread ON MessageThread.MessageThreadId = Message.MessageThreadId
              INNER JOIN Person ON Person .ID = User.Id_person) 
WHERE ([Message].MessageThreadId=@ThreadId)
ORDER BY Message.CreateDate DESC;
END

现在存储过程应该返回选择,但也应该为每一行在 MessageReadState 中插入一行,我该怎么做?

编辑:当然,这应该只在我第一次阅读邮件时完成。我想知道是否有更好的解决方案,就数据库模式而言。 另一个问题..

我怎么知道用户是否有新闻消息? 我的意思是我应该检查在 MessageReadState 中没有一行的线程中的消息?

谢谢

【问题讨论】:

    标签: sql tsql


    【解决方案1】:

    您需要做的就是将查询结果放入临时表中,然后将 UserId 和 MessageId 插入 MessageReadState,通过检查它们是否为 NULL 来检查组合 MessageId/UserId 是否已经存在。

    SELECT TOP(@NumberMessage)
          Message.MessageId
        , Message.CreateDate
        , Message.Body,Person.Name , Person.Surname,Utente.ID,MessageThread.MessageThreadId as MessageThreadID
        , [User].Username,User.[Path] , Person.Image
        , (SELECT MessageReadState.ReadDate 
           FROM MessageReadState 
           WHERE MessageReadState.MessageId = Message.MessageId 
             and MessageReadState.UserId = @UserId) as ReadState
        INTO #messages
        FROM (Message INNER JOIN [Utente] ON Message.SenderUserId = [Utente].ID 
               INNER JOIN MessageThread ON MessageThread.MessageThreadId = Message.MessageThreadId
                      INNER JOIN Person ON Person .ID = User.Id_person) 
        WHERE ([Message].MessageThreadId=@ThreadId)
        ORDER BY Message.CreateDate DESC;
    
        INSERT INTO MessageReadState
        (
          MessageId,
          UserId,
          MessageReadData
        )
        SELECT MessageId,
               UserId,
               'read data'
        FROM #messages m
        LEFT JOIN MessageReadState mrd
          on m.MessageId = mrd.MessageId
          and m.UserId = mrd.UserId
        WHERE mrd.MessageId IS NULL AND mrd.UserId IS NULL;
    
        DROP TABLE #Messages;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      • 2016-01-17
      • 2012-05-05
      相关资源
      最近更新 更多