【发布时间】:2017-12-07 20:18:59
【问题描述】:
我有 2 个表,一个包含所有电子邮件数据,另一个包含所有特定成员电子邮件数据,如果已阅读电子邮件,则其中一个会创建一行。 一旦成员阅读了一封电子邮件,它就会添加到 Member_email_read 表中(该表是根据所有阅读的电子邮件创建和填充的)。
我正在尝试(批量)设置所有要阅读的消息(这将填充 Member_email_read 表),但我可以一次添加一条 (请参阅下面的存储过程),我无法批量添加它们。
这两个表是电子邮件,它保存了系统中每封电子邮件的记录。另一个表格是成员已阅读的所有电子邮件的表格。每次一封电子邮件 被读取一条记录被添加到 Member_email_read 表中。它们在 message_id 上关联(并且两者都应该使用相同的 user_id)。两张表如下-
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]
要将所有消息(对于某个用户)设置为未读,我要做的就是从该表中删除该用户的每条记录,这可以通过以下方式完成:
DELETE FROM [MemberData].[dbo].[Member_email_read]
WHERE [member_email_FK_message_id_FK_user_id] ='2';
我基本上是在寻找这个删除的反面。
我创建了一个存储过程,允许将一个特定的电子邮件设置为读取,但是此存储过程(执行时)需要成员输入 email_id、message_id、user_id、状态、read_datetime 和 delete_datetime。
CREATE PROCEDURE [dbo].[set_member_email_to_read]
@member_email_id int,
@member_email_FK_message_id int,
@member_email_FK_user_id int
@member_email_status varchar(1),
@member_email_read_datetime dateTime,
@member_email_delete_datetime dateTime
as
if not exists (Select * from [dbo].[Member_email_read] where [member_email_FK_message_id] = @member_email_FK_message_id) begin
insert into [dbo].[Member_email_read]
(
[member_email_FK_message_id]
,[member_email_FK_user_id]
,[member_email_status]
,[member_email_read_datetime]
,[member_email_delete_datetime]
)
values
(
@member_email_FK_message_id,
@member_email_FK_user_id
@member_email_status,
@member_email_read_datetime,
@member_email_delete_datetime
)
SELECT Convert(int,SCOPE_IDENTITY()) As InsertedID
end else begin
update [dbo].[Member_email_read] set
[member_email_FK_message_id] = @member_email_FK_message_id
,[member_email_FK_user_id] = @member_email_FK_user_id
,[member_email_status] = @member_email_status
,[member_email_read_datetime] = @member_email_read_datetime
,[member_email_delete_datetime] = @member_email_delete_datetime
where [member_email_FK_user_id] = @member_email_FK_user_id
if (@@ERROR = 0) begin
SELECT Convert(int,@member_email_FK_user_id) As InsertedID
end
end
GO
我希望创建一个允许我输入的存储过程(或通用 SQL 脚本) 一个 user_id,然后允许该用户的所有电子邮件从未读更改为已读(填充 Member_email_read 表)。
【问题讨论】:
-
你考虑过触发器吗?
-
是否有您想要的默认
status?email_read_datetime是当前时间戳,delete_datetime是null? -
不确定是否使用触发器,以前没有真正使用过它们。在这种情况下它将如何工作?
-
状态可以只是新的或读取 email_read_datetime 和 delete_datetime 可能为空 - 这之前已经工作过
-
我认为您不需要为此使用触发器,但
MERGE语句应该允许您从电子邮件表批量插入/更新到已读电子邮件表。不过,我质疑这张桌子的设计。为什么不在同一个电子邮件表中有一个read_datetime字段?
标签: sql sql-server database