如何使用 Raw / SQL Server 获取 knex 中所有更新记录的列表

How to get a list of all updated records in knex using Raw / SQL Server

async updatePerson(critera, transaction) {
    return await this.knex.raw(`
    update person
          SET name = :name_new
          WHERE name = :name_old
`, critera)
      .transacting(transaction);
}

Critera 是关注

的对象
{name_new: 'test person', name_old: 'test person2'}

transactionknex.transaction: https://knexjs.org/#Builder-transacting

我想 return 更新记录 and/or 更新总计 SQL 计数。所以我可以让用户知道 SQL 运行

的结果

类似于

但在 SQL 服务器上使用上述 SQL RAW 查询。

为了获得插入值,我使用了以下方法,效果很好。不确定在更新 SQL:

的情况下如何实现
async addPerson(person, transaction) {
    return await this.knex.raw(`insert into person(
        person_id
       ,name

        )  output inserted.[person_id]
 values(
        NEWID()
       ,:name
          )`, person)
      .transacting(transaction);
  }

人是对象{name: 'test person 123'}

参考:https://knexjs.org/#Raw-Bindings

您还可以将 OUTPUT 子句与 UPDATE 一起使用:

UPDATE person
SET name = :name_new
OUTPUT deleted.name old_name, inserted.name new_name, inserted.person_id
WHERE name = :name_old

测试:

CREATE TABLE #person(person_id int,name varchar(10))

INSERT #person(person_id,name)VALUES(1,'aaa'),(2,'bbb'),(3,'bbb')

-- returns 2 rows
UPDATE #person
SET name = 'ccc'
OUTPUT deleted.name old_name, inserted.name new_name, inserted.person_id
WHERE name = 'bbb'

-- returns 0 rows
UPDATE #person
SET name = 'yyy'
OUTPUT deleted.name old_name, inserted.name new_name, inserted.person_id
WHERE name = 'zzz'

DROP TABLE #person

参考:https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql