存储过程/ SQL脚本,允许我向表中添加记录

时间:2017-12-07 11:18:29

标签: sql sql-server database

我有2个表,一个包含所有电子邮件数据,另一个包含所有特定成员电子邮件数据,如果已读取电子邮件,则会创建一行。 成员读取电子邮件后,会将其添加到Member_email_read表(根据所有已读电子邮件创建和填充)。

我正在尝试设置(大量)要读取的所有消息(这会填充Member_email_read表)但是我可以一次添加一个 (参见下面存储的程序),我无法在质量上添加它们。

这两个表是电子邮件,其中包含每封进入系统的电子邮件的记录。另一个表是该成员已阅读的所有电子邮件的表。每次发电子邮件 读取一条记录被添加到Member_email_read表中。它们在message_id上​​被组合(两者都应该使用相同的user_id)。这两个表如下 -

sonar.search.javaOpts

要将所有消息(对于某个用户)设置为未读,我将不得不删除该用户的该表中的每条记录,这可以通过以下方式完成:

SELECT [member_email_id]
  ,[member_email_FK_message_id]
  ,[member_email_FK_user_id]
  ,[member_email_status]
  ,[member_email_read_datetime]
  ,[member_email_delete_datetime]
FROM [MemberData].[dbo].[Member_email_read]



SELECT[message_id]
  ,[email_catlogue_num]
  ,[email_FK_user_id]
  ,[Email_time]
  ,[email_content]
  ,[Email_created_date]
FROM [MemberData].[dbo].[Email]

我基本上是在寻找这种删除的反面。

我创建了一个存储过程,允许将一个特定电子邮件的设置设置为读取,但是此存储过程(执行时)要求成员输入 email_id,message_id,user_id,status,read_datetime& delete_datetime。

DELETE FROM [MemberData].[dbo].[Member_email_read]
WHERE [member_email_FK_message_id_FK_user_id] ='2';

我希望创建一个允许我输入的存储过程(或通用SQL脚本) user_id然后允许该用户的所有电子邮件从未读更改为读(填充Member_email_read表)。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用MERGEinsert表格向update表格执行批量Email / Member_email_read

MERGE [MemberData].[dbo].[Member_email_read] AS tgt  
USING (
    SELECT message_id, user_id, 'R', null, CURRENT_TIMESTAMP
    FROM [MemberData].[dbo].[Email] 
    WHERE user_id = @UserId
) AS src (MessageId, UserId, Status, ReadDate, DeleteDate) 
ON (
    tgt.member_email_FK_message_id = src.message_id
    AND tgt.member_email_FK_user_id = src.user_id
)  
WHEN MATCHED THEN   
    UPDATE SET tgt.member_email_status = src.Status,
               tgt.member_email_read_datetime = src.ReadDate,
               tgt.member_email_delete_datetime = src.DeleteDate
WHEN NOT MATCHED THEN  
    INSERT (member_email_FK_message_id, member_email_FK_user_id, 
            member_email_status, member_email_read_datetime, member_email_delete_datetime)  
    VALUES (src.MessageId, src.UserId, src.Status, src.ReadDate, src.DeleteDate)
;

这应该可行,但正如我在上面的评论中提到的那样,您应该重新考虑您的表格设计,只需添加read_datetimedelete_datetime(可能是status列,如果您确实需要(以及)你的Email表,而不是只有一个完整的单独的表来保存标识删除状态的记录。