【问题标题】:Getting the ID of inserted item [duplicate]获取插入项目的ID [重复]
【发布时间】:2015-08-25 11:33:37
【问题描述】:

所以我有一个这样的查询:

cmd.CommandText = @"INSERT INTO [dbo].[bill](bruto, waiterid, reversalid, number, ddate, tableid, total, printed, posplace, guestid, numberofguests, closedtime, methodofpaymentid, realdate) " +
                    "VALUES (@bruto, @waiterid, 0, 0, @ddate, 1, @total, 'True', 0, 0, 0, @closedtime, @methodofpaymentid, @realtime) " +
                    "SELECT id";
//+ lines of cmd.Parameter.AddWithValue(...,...);

但是一旦我尝试使用以下命令执行查询:

int newId = Convert.ToInt64(cmd.ExecuteScalar());

我得到那个 id 没有被识别(即使它确实存在)。

如果我尝试将 SELECT 更改为 [dbo].[bill].id,则会收到错误消息

无法绑定多部分标识符“dbo.bill.id”。

我也尝试将其设为SELECT MAX(id)(因为这是最接近标量的东西),但我再次收到未识别的错误。

感谢阅读。

【问题讨论】:

  • 请把SELECT的声明全部发到Q里
  • @tinka 就是这样,我只需要 ID,如果您的意思是我对该表的所有 SELECT 查询,那将超过 100 条语句。

标签: c# sql sql-server


【解决方案1】:

你可以使用

SELECT SCOPE_IDENTITY()

就在您插入查询之后,它将为您提供最后一个插入行的标识。有关SCOPE_IDENTITY() 的详细信息,请查看 MSDN。

返回插入到标识列中的最后一个标识值 范围相同。

【讨论】:

  • 这几乎做到了。谢谢,拉胡尔!当我能够(约 9 分钟)时,我会接受答案
【解决方案2】:

插入语句可能包含一个 OUTPUT INSERTED。子句。

这可能看起来像这样:

INSERT .... OUTPUT INSERTED.ID

并通过您的执行标量调用执行。

【讨论】:

  • 我确实尝试过,但不幸的是,没有成功。我忘了提。
  • 这听起来很奇怪,因为我这样做了好几次
  • 从我从其他 StackOverflow 问题中读到的内容来看,它确实对某些人有用,是的,但看起来这取决于您使用的 SQL Server 版本。
  • 似乎最早出现在SQL Server 2008
猜你喜欢
  • 2014-01-29
  • 2016-06-04
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多