VALUES后不允许子查询?

时间:2017-11-16 08:02:20

标签: c# sql-server sql-server-2005

INSERT INTO t_MT_User (ID, Badge, Name, Scope, comp_code, dept_code, [status]) 
VALUES ((SELECT MAX(ID) + 1 FROM t_MT_User), @userBadgeNumber, @userName, @userScope, @companyCode, @departmentCode, 1)

此查询将引发以下错误:

  

在此上下文中不允许使用子查询。只允许使用标量表达式。

如果我将VALUES更改为SELECT,我会收到另一个错误:

INSERT INTO t_MT_User (ID, Badge, Name, Scope, comp_code, dept_code, [status]) 
    SELECT 
        ((SELECT MAX(ID) + 1 FROM t_MT_User), 
         @userBadgeNumber, @userName, @userScope, @companyCode, 
         @departmentCode, 1)
  

','附近的语法不正确。

如何在此上下文中实现(SELECT MAX(ID) + 1 FROM t_MT_User)

2 个答案:

答案 0 :(得分:6)

首先是第一件事 - 您的代码,即使您修复了它的语法,也是错误的。 好像你试图实现自己的自动增量机制。 那会失败。
正确的方法是使用SQL Server的内置机制进行自动增量,并将ID列创建为Identity

然后您根本不需要将它包含在insert语句中,即使在多客户端或多线程环境中(您当前的实现将开始给出错误的结果),您也是安全的。

答案 1 :(得分:3)

你的语法错了。应该是

INSERT INTO t_MT_User (ID, Badge, Name, Scope, comp_code, dept_code, [status]) 
SELECT MAX(ID) + 1 , @userBadgeNumber, @userName, @userScope, 
       @companyCode, @departmentCode, 1
FROM   t_MT_User