在SQL Server存储过程中声明更安全吗?或者我可以这样使用它



这是我的一个存储过程,我有以下问题:

例如,这是一种更安全的声明@LoginTime的方式吗?还是我可以直接使用LoginTime,因为它在同一个表INFO中?两种方式都有效,但我想知道什么更好、更安全?

    @AccID varchar(21)
AS 
   DECLARE @id char(21)
   SELECT TOP 1 @id = CharNum FROM USERONLINE WHERE AccID = @accid
   DECLARE @LoginTime bigint
   SELECT @LoginTime = LoginTime FROM INFO WHERE UserId = @id
   DECLARE @Time bigint
   SELECT @Time = Time FROM INFO WHERE UserId = @id
   BEGIN TRAN
        UPDATE INFO 
        SET Time = @Time + (DATEDIFF(s,'19700101', GETDATE()) - @LoginTime)  
        WHERE UserId = @id
  COMMIT TRAN

尝试以下查询

BEGIN TRY
    BEGIN TRAN
        UPDATE iFO
            SET
                iFO.Time = iFO.Time + (DATEDIFF(s,'19700101', GETDATE()) - iFO.LoginTime)
        FROM INFO iFO
        INNER JOIN
            (
                SELECT TOP 1 CharNum
                FROM USERONLINE
                WHERE
                    AccID = @AccID
            )uOL ON uOL.CharNum = iFO.UserId
    COMMIT TRAN
END TRY
BEGIN CATCH
    ROLLBACK TRAN
END CATCH

您可以在更新中直接使用Time和LoginTime。这将只是一个原子操作,在事务之外进行查询时,这些值可能会在更新之前更改。

我错过了@id部分,你也可以在更新中使用子查询(或者像Gaurav的回答中那样使用联接)获得id

UPDATE yourtable
SET ...
WHERE UserId = (SELECT TOP 1 Id FROM ...)

为什么不这样做-

DECLARE @id char(21)
   SELECT TOP 1 @id = CharNum FROM USERONLINE WHERE AccID = @accid
BEGIN TRAN
    UPDATE INFO
    SET Time =  (Time + (DATEDIFF(s,'19700101', GETDATE())) - LoginTime)
    FROM INFO 
    WHERE UserId = @id
COMMIT TRAN

相关内容

最新更新