【问题标题】:Delete multiple records from different tables with SQL stored procedure使用 SQL 存储过程从不同表中删除多条记录
【发布时间】:2015-06-12 09:10:27
【问题描述】:

我正在尝试创建一个每 5 分钟左右执行一次存储过程的 SQL 代理作业,但我对部分 SQL 语法不知所措。我正在使用表单身份验证,我需要选择所有在过去 15 分钟内未处于活动状态并且也被标记为临时用户的用户。为此,我将从表aspnet_Users 中获取LastActivityDate,并从表UserProfile 中获取IsTemp。选择后,我需要从我的数据中删除该用户的所有痕迹。以下是我的问题所需的表的基本结构:

    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 的选定用户,以便知道要删除哪个用户,但我不知道该怎么做。其次,我只需要从UserProfile中选择IsTemp = 1的用户。我如何将其包含在我的选择语句中?我也明白我需要两个 SELECT 声明。一个选择UserID 用于删除UserProfileUserFriendImageMessage,另一个用于选择uniqueidentifier 我将在aspnet_Usersaspnet_Membership 中使用.请记住,除了基本的存储过程创建之外,我还没有处理过多的 SQL。非常感谢任何帮助。

如果有人好奇我为什么要这样做...我允许用户选择保持匿名,方法是在进入我的服务时只创建一个用户名。这些用户将是临时用户,如果几天后有人出现并想使用相同的用户名,我不想禁止他们这样做。我也不想挂在不必要的数据上,感觉很脏。

【问题讨论】:

    标签: sql-server stored-procedures


    【解决方案1】:

    试试这个.. 首先获取您必须删除的UserID's 并将它们存储在Temp 表中。

    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)
    

    现在从您的所有事务表中删除所有这些用户。

    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)
    

    【讨论】:

    • 不得不稍作改动,因为 SSMS 在 uniqueidentifierint 之间给出了错误的数据类型错误。最后做了一个单独的SELECT 语句如下:SELECT a.UserID into #UserProfilesToDelete FROM [UserProfile] a INNER JOIN [aspnet_Users] b on a.aspUserID = b.UserId WHERE [Type] = 1 AND LastActivityDate &lt; DATEADD(MI, -15, CURRENT_TIMESTAMP); 并用它来删除UserProfileID。但你让我走上了正轨,谢谢。
    • @TestWell .. 谢谢,如果您还有其他问题,请发布为新问题。如果有帮助,请点赞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多