【问题标题】:SQL Output statement in stored procedure存储过程中的 SQL 输出语句
【发布时间】:2017-08-28 09:26:27
【问题描述】:

请帮助我编辑以下 SQL Server 存储过程,以使用 OUTPUT 语句获取最后插入的行的 ID,以便检索它时抛出 C# 代码,就像

int ID = Convert.ToInt32(insertUser.ExecuteScalar());

存储过程代码:

AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @ID INT 

    INSERT INTO dbo.Registration_Table (StudentName, Email, CourseCode, CourseTitle) 
    VALUES (@StudentName, @Email, @CourseCode, @CourseTitle)  

    SELECT 2
END
GO

【问题讨论】:

  • 过程代码(如存储过程)是高度特定于供应商的 - 所以请添加标签以指定您是否使用mysqlpostgresql、@987654328 @、oracledb2 - 或完全不同的东西。
  • 我正在使用 SQL 和 .Net,请编辑我的代码
  • SQL 是查询语言 - 但它只适用于大多数 RDBMS 系统 - 我们真的需要知道哪个CONCRETE 您正在使用的 RDBMS 系统 - Oracle? SQL 服务器? DB2? MySQL? PostgreSQL? SQL 不够清楚...
  • 我正在使用 MS SQL。我需要的是通过存储过程获取插入的行的 ID

标签: sql-server tsql stored-procedures output


【解决方案1】:

你应该在这篇文章中添加一个“Transact-SQL”标签。

答案是

select SCOPE_IDENTITY()

虽然为了完整起见,我还应该提到您可以在插入语句中使用输出子句,但只有在插入多行时才会有用。

【讨论】:

  • 我正在使用 MS SQL。我需要的是通过存储过程获取插入的行的 ID。范围标识对我有用,但我想通过 OUTPUT 获得结果
  • @Mansoor:但是如果使用SCOPE_IDENTITY() 的这种方法有效 - 你为什么坚持使用OUTPUT ??
  • SCOPE_IDENTITY() 在我阅读时可能会出错。我需要该存储过程插入的特定行的 ID
  • 如果您的 insert 语句插入多条记录,优化器可能会并行执行它,在这种情况下,SCOPE_IDENTITY 可能不会返回确切的最后一条记录 id。在你的语句中,只插入了一条记录,SCOPE_IDENTITY会返回最后一个id。
【解决方案2】:

我终于成功了。如果有人想使用 OUTPUT 子句通过存储过程获得最后插入列的 id,只需使用以下代码。 SCOPE_IDENTITY() 可能导致多用户并行插入时出错

AS
BEGIN
    SET NOCOUNT ON;
     DECLARE @IDs TABLE(ID INT);

    INSERT INTO dbo.Registration_Table(StudentName,Email,CourseCode,CourseTitle)
  OUTPUT inserted.ID INTO @IDs(ID) 
    VALUES (@StudentName, @Email, @CourseCode, @CourseTitle)  

   SELECT ID FROM @IDs;
END
GO

【讨论】:

猜你喜欢
  • 2019-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 2014-03-04
  • 2012-08-17
相关资源
最近更新 更多