Sql server 2008 Track每天是否有用户登录

本文关键字:用户 登录 是否 每天 server 2008 Track Sql | 更新日期: 2023-09-27 18:01:20

我需要写一个函数,如果一个用户每天登录到一个数据库表。

每当用户登录到我的网站时,我需要我的函数来触发并抓取他的UserId和当前日期时间。如果用户在一天内登录两次,则必须再次触发该函数并编写新行。我需要的最终结果是每个登录的数据库表,我可以每天对每个用户进行排序。

这是我的函数,我让它在登录控件的LoggedIn事件上触发

CREATE PROCEDURE loginProc
    @UserId uniqueidentifier,
    @CurrentDateTime datetime
AS
BEGIN
     SELECT GETDATE() AS CurrentDateTime
     SELECT UserId
       FROM dbo.aspnet_Users
      WHERE @UserId = UserId
     INSERT INTO dbo.UserLoginToday
            (UserId, UserLoginPerDay)
     VALUES (@UserId, @CurrentDateTime)
END

它不写任何东西到我的数据库。我做错了什么?这会写入我想要的正确数据吗?

Sql server 2008 Track每天是否有用户登录

CREATE PROCEDURE loginProc
   @UserId uniqueidentifier
AS
BEGIN
     INSERT INTO dbo.UserLoginToday
            (UserId, UserLoginPerDay)
     SELECT UserId, GETDATE()
       FROM dbo.aspnet_Users
      WHERE UserId = @UserId
END

你需要使用过程而不是函数,因为函数不允许DML(插入/更新/删除)语句。

不需要传递当前时间戳作为参数,因为它可以在使用GETDATE()的存储过程中生成并插入到日志表

您忘记给参数赋值了,在WHERE条件中您写了@UserId=UserId,应该是UserId=@UserId。试试这个

CREATE PROCEDURE loginProc
    @UserId uniqueidentifier,
    @CurrentDateTime datetime
AS
BEGIN
     SELECT @CurrentDateTime = GETDATE() AS CurrentDateTime
     SELECT @UserId=UserId
       FROM dbo.aspnet_Users
      WHERE UserId = @UserId
     INSERT INTO dbo.UserLoginToday
            (UserId, UserLoginPerDay)
     VALUES (@UserId, @CurrentDateTime)
END

最优解为-

CREATE PROCEDURE loginProc
    @UserId uniqueidentifier
AS
BEGIN
     INSERT INTO dbo.UserLoginToday
            (UserId, UserLoginPerDay)
     VALUES (@UserId, GETDATE())
END

解释:
1。删除了@CurrentDateTime参数,因为它不需要从应用程序端传递
2。不需要将当前日期和时间赋值给变量,然后在插入语句中使用它,因为我们可以直接在插入语句中使用它作为GETDATE()
3。不需要从dbo.aspnet_users中找到UserId,然后将其赋值给参数变量并在插入语句中使用它。我们已经有了从应用程序端传递过来的UserId值作为参数@UserId,它可以直接在insert语句中使用。