这是我的一个存储过程,我有以下问题:
例如,这是一种更安全的声明@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