sql - MSSQL 更新 : output value before update

标签 sql sql-server tsql

有一个包含 IDU (PK) 和 stat 列的表。如果 stat 的第一位是 1,我需要将它设置为 0 并仅在这种情况下运行一些存储过程,否则我什么都不做。

这是对此的简单查询

DECLARE @s INT
-- get the current value of status before update
SET @s = (SELECT stat FROM  myTable
          WHERE IDU = 999999999)
-- check it first bit is 1
IF (@s & 1) = 1  
BEGIN
    -- first bit is 1, set it to 0
    UPDATE  myTable
    SET status = Stat & ~1
    WHERE IDU = 999999999
    -- first bit is one, in this case we run our SP
    EXEC SOME_STORED_PROCEDURE
END 

但我不确定这个查询是否是最优的。我听说过 UPDATE 查询的 OUTPUT 参数,但我发现了如何获取插入值。有没有办法获取插入前的值?

最佳答案

是的,OUTPUT子句允许您在更新之前获取以前的值。您需要查看 deletedinserted 表。

DELETED

Is a column prefix that specifies the value deleted by the update or delete operation. Columns prefixed with DELETED reflect the value before the UPDATE, DELETE, or MERGE statement is completed.

INSERTED

Is a column prefix that specifies the value added by the insert or update operation. Columns prefixed with INSERTED reflect the value after the UPDATE, INSERT, or MERGE statement is completed but before triggers are executed.

-- Clear the first bit without checking what it was

DECLARE @Results TABLE (OldStat int, NewStat int);

UPDATE myTable
SET Stat = Stat & ~1
WHERE IDU = 999999999
OUTPUT
    deleted.Stat AS OldStat
    ,inserted.Stat AS NewStat
INTO @Results
;

-- Copy data from @Results table into variables for comparison
-- Assumes that IDU is a primary key and @Results can have only one row

DECLARE @OldStat int;
DECLARE @NewStat int;

SELECT @OldStat = OldStat, @NewStat = NewStat
FROM @Results;

IF @OldStat <> @NewStat 
BEGIN
    EXEC SOME_STORED_PROCEDURE;
END;

关于sql - MSSQL 更新 : output value before update,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45736458/

相关文章:

.net - 如何从 SQL Server 获取数据到 SqlDataReader?

sql - 为什么我不能在 SQL 中创建这个表?

sql - T-SQL : SELECT posts where trend is downwards on two time periods

sql - 总结所有行排除 Oracle 报告中的负数

java - 在不使用 sql 或 nosql 服务器的情况下将数据提供程序集成到应用程序

mysql - 创建了一个 View 但之后失去了对基础表的特权

sql - 如果连接存在则从连接表返回值

mysql - GROUP BY 逗号分隔列表的成员

sql-server - 是否可以在链接服务器上创建表?

PHP,将 PDO 与嵌套查询一起使用,结果已损坏