如何在MS SQL中向标识列插入数据?代码报错求助
问题分析
你碰到的是两个关联问题:
- 语法错误:
VALUES()里没有填任何值,SQL Server的语法规则不允许这种空值列表,这就是抛出Incorrect syntax near ')'的直接原因。 - 标识列限制:
id是IDENTITY(1,1)类型的列,默认情况下SQL Server不允许你手动往标识列插入值,必须先开启特定设置才能操作。
解决方案
根据你的实际需求,分两种场景处理:
场景1:不需要手动指定ID,让SQL自动生成
如果只是想插入一条记录,让SQL Server按IDENTITY(1,1)的规则自动生成ID,那完全不需要在INSERT语句里写id列,直接用默认值插入或者指定其他列即可:
// 当表中只有id列时,用DEFAULT VALUES插入空记录,SQL会自动生成ID SqlCommand writeCommand = new SqlCommand("INSERT INTO computers DEFAULT VALUES", conn.GetConnection()); writeCommand.ExecuteNonQuery(); // 如果表中有其他列,直接插入其他列的值即可,id会自动生成 // SqlCommand writeCommand = new SqlCommand("INSERT INTO computers (device_name, purchase_date) VALUES ('办公台式机', '2024-05-20')", conn.GetConnection());
场景2:必须手动插入指定的ID值到标识列
如果确实需要往标识列里插入自定义的ID,那必须先开启IDENTITY_INSERT开关,插入完成后再关闭它(避免影响后续对该表的操作)。示例代码如下:
using (var connection = conn.GetConnection()) { connection.Open(); // 第一步:开启IDENTITY_INSERT,允许手动插入标识列的值 using (var enableCmd = new SqlCommand("SET IDENTITY_INSERT computers ON", connection)) { enableCmd.ExecuteNonQuery(); } // 第二步:执行插入,务必指定id列和对应的值(用参数化查询避免SQL注入) using (var writeCommand = new SqlCommand("INSERT INTO computers(id) VALUES(@customId)", connection)) { // 替换成你需要插入的具体ID数值 writeCommand.Parameters.AddWithValue("@customId", 1005); writeCommand.ExecuteNonQuery(); } // 第三步:关闭IDENTITY_INSERT,恢复默认的自动生成规则 using (var disableCmd = new SqlCommand("SET IDENTITY_INSERT computers OFF", connection)) { disableCmd.ExecuteNonQuery(); } }
注意事项
- 开启
IDENTITY_INSERT后,插入时必须显式写出标识列的列名,不能省略。 - 插入的ID值不能和表中已有的标识值重复,否则会抛出主键冲突的异常。
- 一定要记得关闭
IDENTITY_INSERT,否则后续对该表的插入操作可能会报错。
内容的提问来源于stack exchange,提问作者Vavřinec Kubíček
相关产品推荐
相关产品推荐

