最近使用NodeJS的mssql模块连接SQLServer数据库出现了"Incorrect syntax near the keyword ‘user’."的错误,Google了一下发现原来我在SQLServer中使用了user作为表明,但是SQLServer中user是保留的关键字,不能被用于做表名或者变量名。所以解决方案很简单,直接重命名表名user为t_user或者其他的名称就OK了。
在SQLServer中定义表结构user并为其添加数据
我用的是Windows10系统,在本地系统中安装了SQLServer2012数据库,可以使用SQL Server Management Studio或者Navicat Premium 12等工具连接SQLServer数据库。我习惯使用Navicat Premium 12这个数据库客户端工具,连接到SQLServer数据库后,在Navicat Premium 12中创建UserDB数据库,再为其创建一个user表 ,其表结构定义如下图所示:
再为user表添加几条记录,如下图所示:
对应的user表的SQL脚本如下:
代码语言:javascript复制/*
Navicat Premium Data Transfer
Source Server : localhost_SqlServer
Source Server Type : SQL Server
Source Server Version : 11002100
Source Host : localhost:1433
Source Catalog : UserDB
Source Schema : dbo
Target Server Type : SQL Server
Target Server Version : 11002100
File Encoding : 65001
Date: 06/03/2020 07:50:41
*/
-- ----------------------------
-- Table structure for user
-- ----------------------------
IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[user]') AND type IN ('U'))
DROP TABLE [dbo].[user]
GO
CREATE TABLE [dbo].[user] (
[name] varchar(255) COLLATE Chinese_PRC_CI_AS NULL,
[age] int NULL,
[sex] tinyint NULL
)
GO
ALTER TABLE [dbo].[user] SET (LOCK_ESCALATION = TABLE)
GO
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO [dbo].[user] VALUES (N'小明', N'23', N'1')
GO
INSERT INTO [dbo].[user] VALUES (N'王五', N'21', N'1')
GO
INSERT INTO [dbo].[user] VALUES (N'小红', N'20', N'0')
GO
INSERT INTO [dbo].[user] VALUES (N'小丽', N'22', N'0')
GO
配置好NodeJS环境,提前安装好Node和NPM以及VSCode等IDE,然后在VSCode项目目录下的终端中安装mssql模块
mssql模块是NodeJS下的一个用于连接SQLServer数据库的npm模块,其npm地址为:https://www.npmjs.com/package/mssql 安装命令如下:
代码语言:javascript复制npm install mssql
在NodeJS中使用mssql连接SQLServer并查询UserDB数据库中的user表
在VSCode中的对应的目录创建一个mssqlTest.js文件,其代码如下:
代码语言:javascript复制// mssql模块的简单使用
// https://www.npmjs.com/package/mssql
var sql = require('mssql');
// DB configuration
var dbConfig = {
user: 'sa',
password: '1030',
server: 'localhost',
database: 'UserDB',
port: 1433,
pool: {
max: 10,
min: 0,
idleTimeoutMillis: 30000
}
};
// 查询所有的用户信息
function getAllUsers() {
var conn = new sql.ConnectionPool(dbConfig);
//console.log(conn);
var req = new sql.Request(conn);
conn.connect(function (err) {
if (err) {
console.log(err);
return;
}
// 查询user表
req.query("SELECT * FROM user", function (err, recordset) {
if (err) {
console.log(err);
return;
}
else {
console.log(recordset);
}
conn.close();
});
});
}
// 查询所有的用户信息
getAllUsers();
上面的代码主要是使用mssql模块连接SQLServer数据库,首先设置好SQLServer数据库的连接池信息,再查询user表,并打印查询后的结果,在VSCode中运行没想到出现了下面的错误,截图如下图所示:
报错信息“Incorrect syntax near the keyword ‘user’.”,于是Gogole搜索发现有不少人也出现了此问题:
在博客园[Incorrect syntax near the keyword ‘user’.解决方案](Incorrect syntax near the keyword ‘user’.解决方案)中找到了博主浪迹天涯的这篇博文,原因是: 在postgresql、sql99以及sql92都把user作为保留字了!既然是保留字,就不能用了。 解决方案就是把表名user改成t_user或者其他的名字就OK了。 在https://stackoverflow.com的c# incorrect syntax near the keyword 'user’这篇问题里面对这个错误有详细的描述:
Microsoft SQL Server uses reserved keywords for defining, manipulating, and accessing databases. Reserved keywords are part of the grammar of the Transact-SQL language that is used by SQL Server to parse and understand Transact-SQL statements and batches. Although it is syntactically possible to use SQL Server reserved keywords as identifiers and object names in Transact-SQL scripts, you can do this only by using delimited identifiers. 可以从https://docs.microsoft.com/en-us/sql/t-sql/language-elements/reserved-keywords-transact-sql?view=sql-server-2017看到SQLServer数据库中的保留字的列表,如下图所示:
从上图2中可以看出USER是SQLServer数据库中的保留字,用户不能使用其作为表明。
在SQLServer数据库UserDB中将表名user修改为t_user,然后在mssqlTest.js代码中相应的修改表名
修改后的mssqlTest.js代码如下:
代码语言:javascript复制// mssql模块的简单使用
// https://www.npmjs.com/package/mssql
var sql = require('mssql');
// DB configuration
var dbConfig = {
user: 'sa',
password: '1030',
server: 'localhost',
database: 'UserDB',
port: 1433,
pool: {
max: 10,
min: 0,
idleTimeoutMillis: 30000
}
};
// 查询所有的用户信息
function getAllUsers() {
var conn = new sql.ConnectionPool(dbConfig);
//console.log(conn);
var req = new sql.Request(conn);
conn.connect(function (err) {
if (err) {
console.log(err);
return;
}
// 查询t_user表
req.query("SELECT * FROM t_user", function (err, recordset) {
if (err) {
console.log(err);
return;
}
else {
console.log(recordset);
}
conn.close();
});
});
}
// 查询所有的用户信息
getAllUsers();
在VSCode中运行截图如下所所示:
参考资料
- [Incorrect syntax near the keyword ‘user’.解决方案](Incorrect syntax near the keyword ‘user’.解决方案)
- Incorrect syntax near the keyword ‘User’
- c# incorrect syntax near the keyword ‘user’
- SQLServer-Reserved Keywords (Transact-SQL)