【问题标题】:Update check t-sql更新检查t-sql
【发布时间】:2013-08-13 12:16:40
【问题描述】:

你好有更新表的程序。

UPDATE myTbl
SET pswd = @newPswd
where id = @id and pswd = @pswd

现在要检查

if pswd <> @pswd
print 'error'

怎么做?当我在哪里有错误无效列之后写它时

【问题讨论】:

  • 不,我们不检查表的内容来查看更新是否成功。如果更新失败,则会出现错误。在 T/SQL 过程中,过去通过查看 @@error 来检查错误,但现在 Try/Catch 可用,而且要好得多。 See this example.

标签: sql sql-server


【解决方案1】:

您不能在 if 语句中直接调用列的名称。您需要将 pswd 的值设置为一个局部变量(不同于 @pswd 变量),然后比较两者。

 Declare @tempPswd varchar(20)
Select @tempPswd = pswd
From myTbl
Where id = @id

if (@tempPswd <> @pswd)
  Print 'Error....'
Else
Begin
  Update myTbl
  Set pswd = @newPswd
  Where id = @id and pswd = @pswd
End

【讨论】:

    【解决方案2】:

    您可以使用@@ROWCOUNT 计算出前一条语句影响了多少行:

    UPDATE myTbl
    SET pswd = @newPswd
    where id = @id and pswd = @pswd
    if @@ROWCOUNT = 0
        print 'Error - @id and/or @pswd didn''t match'
    

    您可能还需要考虑使用RAISERRORTHROW(如果适用)而不是仅使用PRINT 来处理错误情况。

    如果您需要对返回的特定行数进行进一步处理,您应该将其捕获到一个变量中并使用该变量 - 每个 语句都会导致 @@ROWCOUNT 重置。

    【讨论】:

    • in if pswd @pswd 我的意思是例如如果 pswd = 5 和 @ psw = 6 if 56 print 'error'
    • @GeoVIP - 我采取不同的策略来推断@pswd 与当前密码不匹配 - 如果UPDATE 影响零行,那么显然其中一个或两个条件未满足 WHERE 子句。如果您的@id 值保证与某一特定行的id 列匹配,那么您可以推断 pswd@pswd 不匹配。
    【解决方案3】:

    你可以使用EXISTS()函数

    IF EXISTS(SELECT * FROM myTbl WHERE id = @id and pswd <> @pswd)
    BEGIN
        print 'error'
    END 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      • 2011-02-25
      • 2011-01-17
      相关资源
      最近更新 更多