Как получить список всех обновленных записей в knex, используя Raw / SQL Server - PullRequest
0 голосов
/ 29 апреля 2019
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'}

transaction является knex.transaction: https://knexjs.org/#Builder-transacting

Я хотел бы вернуть обновленные записи и / илиобновлено общее количество в SQL.Поэтому я могу сообщить пользователю о результате выполнения SQL

Аналогично Как получить список всех обновленных записей в knex / mysql

, но с использованием вышеупомянутого SQLзапрос в RAW с SQL Server.

Чтобы получить вставленное значение, я использую следующее, которое работает нормально.Не уверен, как этого можно добиться в случае обновления 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'}

Ref: https://knexjs.org/#Raw-Bindings

1 Ответ

0 голосов
/ 29 апреля 2019

Вы также можете использовать 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

...