Построение безопасного динамического запроса с использованием SQL Server - PullRequest
1 голос
/ 07 мая 2019

Я новичок в использовании библиотеки nodejs mssql / tedious. У меня есть таблица, которая использует значения по умолчанию для столбцов, и я не могу ожидать, что в журналах всегда присутствуют все эти значения. Мне интересно, есть ли более простой способ безопасного построения динамического запроса на основе того, какие значения передаются в мою функцию журнала.

const sql = require('mssql')
const config = require('config')

const dconfig = config.database

const addLog = async (options) => {
  const { text, sentSuccess, isError } = options
  try {
    let pool = await sql.connect(dconfig)
    let request = await pool.request()
    request.input('message', sql.Text, text.trim())
    if (sentSuccess) {
      request.input('sent', sql.Bit, !!parseInt(sentSuccess))
      await request.query('insert into dbo.MApp_Logs (message, sent_success) values (@message, @sent)')
    } else {
      await request.query('insert into dbo.MApp_Logs (message) values (@message)')
    }
  } catch (err) {
    throw err
  } finally {
    sql.close()
  }
}

Вы можете видеть, что здесь я вынужден несколько раз переписывать запрос в зависимости от того, какие значения присутствуют. Есть ли более элегантный способ справиться с этим без объединения значений в строку?

1 Ответ

1 голос
/ 07 мая 2019

Мне действительно не нравится использовать или полагаться на DEFAULT ограничения в SQL, кроме как для обратной совместимости;но это вопрос вкуса и предпочтений.Я бы предпочел обрабатывать ваши значения по умолчанию в коде для новой работы и всегда отправлять один и тот же оператор SQL:

 request.input('message', sql.Text, text.trim())
 if (sentSuccess)
     request.input('sent', sql.Bit, !!parseInt(sentSuccess))
 else
     request.input('sent', sql.Bit, theDefaultValue)
 await request.query('insert into dbo.MApp_Logs (message, sent_success) values (@message, @sent)')

Однако, если вы действительно хотите использовать определения SQL по умолчанию, вы всегда можете связать оператор SQL ипродолжить параметризацию:

 request.input('message', sql.Text, text.trim())
 let sqlFields = "insert into dbo.MApp_Logs (message"
 let sqlValues = ") values (@message"

 if (sentSuccess) {
     request.input('sent', sql.Bit, !!parseInt(sentSuccess))
     sqlFields += ", sent_success"
     sqlValues += ", @sent"
 }

 await request.query(sqlFields + sqlValues + ")")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...