如何用mssql的ES6标签模板正确执行CREATE DATABASE语句?
使用mssql时参数化执行CREATE DATABASE等DDL语句的问题
使用npm包mssql时,我发现用ES6标签模板字面量结合CREATE DATABASE命令会报错。运行以下代码时,预期创建名为my_db的数据库:
const dbname = 'my_db'; await pool.request().query`CREATE DATABASE ${dbname}`;
实际收到RequestError错误,提示“'@param1'附近有语法错误”及对应栈追踪。
替代尝试1
const dbname = 'my_db'; await pool.request().query`CREATE DATABASE [${dbname}]`;
失败:创建的数据库名称为@param1。
替代尝试2
const dbname = 'my_db'; await pool.request() .input('dbname', sql.VarChar, dbname) .query('CREATE DATABASE @dbname');
失败:收到RequestError错误,提示“@dbname附近有语法错误”及对应栈追踪。
替代尝试3
const dbname = 'my_db'; await pool.request().query(`CREATE DATABASE [${dbname}]`);
部分成功:成功创建my_db数据库,但未对名称做参数化安全处理,相关问题在GitHub议题#1568中被提及。
替代尝试4
const dbname = 'my_db'; await pool.request().query` DECLARE @_dbname VARCHAR(128) = ${dbname}; EXEC('CREATE DATABASE ' + @_dbname);`;
成功:通过动态SQL执行,但需要额外添加语句,更像临时方案。
执行CREATE USER...FOR LOGIN...等命令时也遇到类似问题。目前仅尝试3和4有效,但都存在不足,请问是否有官方的参数化方案?
软件版本
- node: v20.9.0
- npm: 10.1.0
- mssql: v11.0.0
- SQL Server 2019 Express(64-bit)
- OS: Windows Server 2016 Datacenter
内容的提问来源于stack exchange,提问作者Jasel
相关产品推荐
相关产品推荐

