使用 SQL 存储过程从不同表中删除多条记录
Delete multiple records from different tables with SQL stored procedure
我正在尝试创建一个 SQL 代理作业,它每 5 分钟左右执行一次存储过程,但我对 SQL 语法的一部分不知所措。我正在使用表单身份验证,我需要 select 所有在过去 15 分钟内未激活并且也被标记为临时的用户。为此,我将从 table aspnet_Users
中获取 LastActivityDate
并从 table UserProfile
中获取 IsTemp
。在 selection 之后,我需要从我的数据中删除该用户的所有痕迹。以下是我的问题所必需的 table 的基本结构:
aspnet_Users(uniqueidentifier UserId PK)
aspnet_Membership(uniqueidentifier UserId FK)
UserProfile(int UserProfileID PK, uniqueidentifier aspnetUserID FK, int IsTemp)
UserFriend(int UserFriendID PK, int UserProfileID FK)
Image(int ImageID PK, int UserProfileID FK)
Message(int MessageID, int UserProfileID FK)
这是我目前的情况:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[CleanUpUserProfiles]
-- Add the parameters for the stored procedure here
AS
BEGIN
SET NOCOUNT ON;
SELECT *
FROM [UserProfile]
WHERE IsTemp = 1
SELECT *
FROM [aspnet_Users]
WHERE LastActivityDate < DATEADD(mi, -15, CURRENT_TIMESTAMP)
SELECT *
FROM [UserProfile]
WHERE IsTemp = 1
DELETE FROM [Message]
WHERE ??? = @???
DELETE FROM [Image]
DELETE FROM [UserFriend]
DELETE FROM [UserProfile]
DELETE FROM [aspnet_Membership]
DELETE FROM [aspnet_Users]
END
GO
我知道我需要一个变量来保存来自 aspnet_Users
的 selected 用户,以便知道要删除哪些,但我不知道该怎么做。其次,我只需要 select 个来自 UserProfile
的 IsTemp = 1
用户。我如何将其包含在我的 select 声明中?我还知道我需要两个 SELECT
语句。一个到 select UserID
用于删除 UserProfile
、UserFriend
、Image
和 Message
,另一个用于 select我将在 aspnet_Users
和 aspnet_Membership
中使用 uniqueidentifier
的离子。请记住,除了基本的存储过程创建之外,我没有处理 SQL。非常感谢任何帮助。
如果有人对我为什么要这样做感到好奇...我允许用户选择通过在访问我的服务时仅创建用户名来保持匿名。这些用户将是临时的,如果几天后有人出现并想使用相同的用户名,我不想禁止他们这样做。我也不想保留不必要的数据,感觉很脏。
试试这个.. 首先获取您必须删除的 UserID's
并将它们存储在 Temp
table 中。
Select a.UserID into #UserToDelete from aspnet_users a
inner join UserProfile b on a.UserID = b.aspnetUserID
where IsTemp=1 and LastActivityDate < DATEADD(mi, -15, CURRENT_TIMESTAMP)
现在从您的所有交易 table 中删除所有这些用户。
DELETE FROM [Message] where UserProfileID in (select userid from #UserToDelete)
DELETE FROM [Image] where UserProfileID in (select userid from #UserToDelete)
DELETE FROM [UserFriend] where UserProfileID in (select userid from #UserToDelete)
DELETE FROM [UserProfile] where aspnetUserID in (select userid from #UserToDelete)
DELETE FROM [aspnet_Membership] where userID in (select userid from #UserToDelete)
DELETE FROM [aspnet_Users] where userID in (select userid from #UserToDelete)
我正在尝试创建一个 SQL 代理作业,它每 5 分钟左右执行一次存储过程,但我对 SQL 语法的一部分不知所措。我正在使用表单身份验证,我需要 select 所有在过去 15 分钟内未激活并且也被标记为临时的用户。为此,我将从 table aspnet_Users
中获取 LastActivityDate
并从 table UserProfile
中获取 IsTemp
。在 selection 之后,我需要从我的数据中删除该用户的所有痕迹。以下是我的问题所必需的 table 的基本结构:
aspnet_Users(uniqueidentifier UserId PK)
aspnet_Membership(uniqueidentifier UserId FK)
UserProfile(int UserProfileID PK, uniqueidentifier aspnetUserID FK, int IsTemp)
UserFriend(int UserFriendID PK, int UserProfileID FK)
Image(int ImageID PK, int UserProfileID FK)
Message(int MessageID, int UserProfileID FK)
这是我目前的情况:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[CleanUpUserProfiles]
-- Add the parameters for the stored procedure here
AS
BEGIN
SET NOCOUNT ON;
SELECT *
FROM [UserProfile]
WHERE IsTemp = 1
SELECT *
FROM [aspnet_Users]
WHERE LastActivityDate < DATEADD(mi, -15, CURRENT_TIMESTAMP)
SELECT *
FROM [UserProfile]
WHERE IsTemp = 1
DELETE FROM [Message]
WHERE ??? = @???
DELETE FROM [Image]
DELETE FROM [UserFriend]
DELETE FROM [UserProfile]
DELETE FROM [aspnet_Membership]
DELETE FROM [aspnet_Users]
END
GO
我知道我需要一个变量来保存来自 aspnet_Users
的 selected 用户,以便知道要删除哪些,但我不知道该怎么做。其次,我只需要 select 个来自 UserProfile
的 IsTemp = 1
用户。我如何将其包含在我的 select 声明中?我还知道我需要两个 SELECT
语句。一个到 select UserID
用于删除 UserProfile
、UserFriend
、Image
和 Message
,另一个用于 select我将在 aspnet_Users
和 aspnet_Membership
中使用 uniqueidentifier
的离子。请记住,除了基本的存储过程创建之外,我没有处理 SQL。非常感谢任何帮助。
如果有人对我为什么要这样做感到好奇...我允许用户选择通过在访问我的服务时仅创建用户名来保持匿名。这些用户将是临时的,如果几天后有人出现并想使用相同的用户名,我不想禁止他们这样做。我也不想保留不必要的数据,感觉很脏。
试试这个.. 首先获取您必须删除的 UserID's
并将它们存储在 Temp
table 中。
Select a.UserID into #UserToDelete from aspnet_users a
inner join UserProfile b on a.UserID = b.aspnetUserID
where IsTemp=1 and LastActivityDate < DATEADD(mi, -15, CURRENT_TIMESTAMP)
现在从您的所有交易 table 中删除所有这些用户。
DELETE FROM [Message] where UserProfileID in (select userid from #UserToDelete)
DELETE FROM [Image] where UserProfileID in (select userid from #UserToDelete)
DELETE FROM [UserFriend] where UserProfileID in (select userid from #UserToDelete)
DELETE FROM [UserProfile] where aspnetUserID in (select userid from #UserToDelete)
DELETE FROM [aspnet_Membership] where userID in (select userid from #UserToDelete)
DELETE FROM [aspnet_Users] where userID in (select userid from #UserToDelete)