使用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”,
原始错误:[错误:[Microsoft] [SQL Server Native Client 11.0] [SQL Server]“ @ var2”附近的语法不正确。] {
sqlstate:“ 42000”,
代码:102
},
名称:“ RequestError ',
数字:102,
州:'42000'
}

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

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

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

David Browne-微软

我是否缺少某些无法用于创建数据库查询的输入或类似的输入?

是。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章