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

Sql server 在SQL Server存储过程中声明是否更安全,或者我可以这样使用它?,sql-server,Sql Server,这是我的一个存储过程,我有以下问题: 例如,这是一种更安全的声明@LoginTime的方法,还是我可以直接使用LoginTime,因为它位于同一个表信息中?两种方法都有效,但我想知道什么更好更安全 @AccID varchar(21) AS DECLARE @id char(21) SELECT TOP 1 @id = CharNum FROM USERONLINE WHERE AccID = @accid DECLARE @LoginTime bigint

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

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

    @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

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

我错过了@id部分,你也可以通过update中的子查询或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
尝试下面的查询

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

在当前格式中,您的脚本无效-您可能希望更新它。您是否尝试运行发布的代码?第一行:@AccID varchar21 AS无效。看起来您在开始时遗漏了创建过程或创建函数部分。运行代码,使其有效并重新发布。它是有效的。我只是没有包括它的其余部分,因为我认为很明显它正在运行。对不起就安全而言,这真的比我的更好吗?此外,它还显示了一个错误:关键字“iFO”和“uOL”附近的语法不正确。您能为您的表结构提供一些数据吗?我理解。没关系,我是这样做的:更新信息集时间=选择时间+日期差,'19700101',GETDATE-LoginTime from info where UserId=@id where UserId=@id然而,就安全性而言,这比我在主要帖子中提供的另一个更好吗?你应该一次性这么做的原因是它阻止了在你和你之间的表中更改数据的边缘情况更新它。这种边缘情况非常罕见,但发生时非常令人困惑。尽可能编写更简单的代码,减少bug。这两段代码之间没有安全性差异,除非您考虑到一个特定的安全问题?就安全性而言,这真的比我的更好吗?是的,我想是的。请注意,您不是专门从表中获取值,然后将其用于更新。您正在执行的过程只会使您的sp有点慢。我在这里使用的进程只是一个原子进程。实际上我从表中得到了值:Time,LoginTime。。或者你是说我不明白的其他事情?还有,我为什么要选择何时可以直接更新。。是的,这就是我想告诉你的。在这里,我在一个原子操作中完成了所有这些。您首先在不同的操作中从表中获取值,然后在更新时使用相同的值,但这是不同的操作。只是不明白为什么从同一个表中选择两个不同的操作更好?为了确保,你说它应该比我提供的更好、更快、更安全?让我知道,这样我就可以接受答案,非常感谢!因此,在内部使用它们而不首先声明它们是安全的吗?如果您关心的是安全性,那么afaik没有区别,考虑到如果您有单独的查询,它们应该是事务的一部分,以确保一致性。