我有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表)。
答案 0 :(得分:0)
您可以尝试使用MERGE
从insert
表格向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_datetime
和delete_datetime
(可能是status
列,如果您确实需要(以及)你的Email
表,而不是只有一个完整的单独的表来保存标识删除状态的记录。