首页 > 解决方案 > 使用 nodejs 和 mssql 模块创建带有参数化输入的 SQL Server 数据库

问题描述

我正在尝试构建一个 nodejs CLI 以使用该mssql模块与 SQL Server 2017 进行交互。第一个元素是动态创建数据库作为更大异步函数的一部分。用户将提供数据库的名称和大小,CLI 将在机器上的默认位置创建它。

带有硬编码值的示例:

let newDB = await pool.request()
    .query(`CREATE DATABASE [testDB] ON PRIMARY
            (NAME = N'testDB',
                    FILENAME = N'C:\\Program Files\\Microsoft SQL Server\\MSSQL14.MSSQLSERVER\\MSSQL\\DATA\\testDB.mdf',
                    SIZE = 100MB,
                    FILEGROWTH = 100MB)
                LOG ON
            (NAME = N'testDB_log',
                FILENAME = N'C:\\Program Files\\Microsoft SQL Server\\MSSQL14.MSSQLSERVER\\MSSQL\\DATA\\testDB_log.ldf',
                SIZE = 100MB,
                FILEGROWTH = 100MB);`)  

这工作得很好,并在正确的位置以正确的大小创建了一个名为 testDB 的数据库。

带有单个参数化输入(数据库名称)的示例:

let newDB = await pool.request()
    .input('dbName', sql.VarChar, 'testDB')
    .query(`CREATE DATABASE [@dbName] ON PRIMARY
            (NAME = N'testDB',
                    FILENAME = N'C:\\Program Files\\Microsoft SQL Server\\MSSQL14.MSSQLSERVER\\MSSQL\\DATA\\testDB.mdf',
                    SIZE = 100MB,
                    FILEGROWTH = 100MB)
                LOG ON
            (NAME = N'testDB_log',
                FILENAME = N'C:\\Program Files\\Microsoft SQL Server\\MSSQL14.MSSQLSERVER\\MSSQL\\DATA\\testDB_log.ldf',
                SIZE = 100MB,
                FILEGROWTH = 100MB);`)  

这会创建一个数据库,但它被称为@testDB- 本质上忽略输入值并将其作为值本身读取。

所有输入的示例:

let newDB = await pool.request()
    .input('dbName', sql.VarChar, Name_InputVariable) //Name of database e.g. TestDB
    .input('dbSize', sql.Int, Size_InputVariable) //Size of database e.g. 100
    .input('dbLocation', sql.VarChar, Location_InputVariable) //Location of database e.g. location on c drive    
    .query(`CREATE DATABASE [@dbName] ON PRIMARY
            (NAME = N'@dbName',
                    FILENAME = N'@dbLocation\\@dbName.mdf',
                    SIZE = @dbSize MB,
                    FILEGROWTH = 100MB)
                LOG ON
            (NAME = N'@dbName_log',
                FILENAME = N'@dbLocation\\@dbName_log.ldf',
                SIZE = 100MB,
                FILEGROWTH = 100MB);`)  

这不起作用并返回以下错误:

RequestError:“@var2”附近的语法不正确。
代码:'EREQUEST',
originalError:[错误:[Microsoft][SQL Server Native Client 11.0][SQL Server]'@var2' 附近的语法不正确。] {
sqlstate:'42000',
代码:102
},
名称:'RequestError ',
编号:102,
状态:'42000'
}

我完全预计当我放入所有变量时会出现错误,但是即使在基本级别上,也很难开始调试任何代码,只有一个输入,它没有像我预期的那样做。我发现的大多数示例只显示了 where 子句中使用的单个输入,效果很好,但这不是我想要实现的。

作为参考,我已经设法让简单的 where 子句查询起作用,但是我是否缺少这些不能用于创建数据库查询或类似的输入的东西......?如果是这种情况,使用节点 js 动态创建 SQL Server 数据库的正确方法是什么?

对此的任何帮助或见解将不胜感激。

标签: node.jssql-server

解决方案


我是否遗漏了无法用于创建数据库查询或类似内容的此类输入的某些内容...?

是的。

您必须使用字符串连接/插值,因为 SQL Server 不支持数据定义语言 (DDL) 语句的参数化。


推荐阅读