NodeJS使用mssql连接SQLServer出现"Incorrect syntax near the keyword 'user'."

2020-03-09 16:34:46 浏览数 (1)

最近使用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)

0 人点赞