點燈坊

失くすものさえない今が強くなるチャンスよ

對 MSSQL 刪除資料

Sam Xiao's Avatar 2021-10-26

可將 DELETE Statement 直接傳入 Node-mssql,並且支援 Template String 實現 Parameter 避免湊字串而造成 SQL Injection。

Version

Node 14.18.1
Node-mssql 7.2.1
MSSQL 2017

Add Library

$ yarn add mssql

mssql:安裝 node-mssql 連接 MSSQL。

DELETE

import sql from 'mssql'

await sql.connect ({
  server: 'mssql-2017',
  port: 1433,
  user: 'sa',
  password: '111111',
  database: 'KnexLab',
  options: {
    trustServerCertificate: true
  }
})

let id = 13

let { recordset } = await sql.query (`
  DELETE FROM articles
  WHERE id = ${id}
  SELECT @@ROWCOUNT AS rows
`)
console.log (recordset)

第 3 行

await sql.connect ({
  server: 'mssql-2017',
  port: 1433,
  user: 'sa',
  password: '111111',
  database: 'KnexLab',
  options: {
    trustServerCertificate: true
  }
})

使用 Node-mssql 連接 MSSQL:

  • server:設定 server 名稱,不能使用 IP
  • port:設定 port
  • user:設定 id
  • password:設定 password
  • database:設定連接 database
  • trustServerCertificate:本機開發設定為 true
  • sql.connect 回傳 Promise,因此要加上 top level await

14 行

let id = 13

let { recordset } = await sql.query (`
  DELETE FROM articles
  WHERE id = ${id}
  SELECT @@ROWCOUNT AS rows
`)
console.log (recordset)
  • DELETE 傳入 sql.query
  • DELETE 直接以 Template String 達成 parameter,String 要自行加上 '
  • 若要回傳 DELETE 所執行筆數,必須加上 SELECT @@ROWCOUNT
  • sql.query 回傳為 Promise,使用 top level await 處理
  • 使用 Object Destructure 抽出 recordset 才是實際回傳 Array

delete000

Conclusion

  • sql.query 支援 Promise,因此可使用 Promise Chain 或 Async Await 處理皆可
  • T-SQL 無法使用 RETURNING * 回傳剛修改資料,因此只能使用 SELECT @@ROWCOUNT 回傳執行筆數