【问题标题】:Getting the primary key of an newly inserted row in SQL Server 2008获取 SQL Server 2008 中新插入行的主键
【发布时间】:2012-08-22 19:45:04
【问题描述】:

我有一堆数据将插入到表中。这个问题是我需要它将主键返回到该表。我不确定是否有类似的东西:

 insert into TABLE (...) values (...) RETURNING p_key

 select p_key from (insert into TABLE (...) values (...))

我正在为浏览器和保存的信息做一个解决方法,这些信息或多或少会添加一行然后更新它......但是如果没有主键,就无法更新它,因为没有对它的引用。

我在网上查找并通过 google 找到了一些示例,但这些示例让我有些困惑。

http://en.wikipedia.org/wiki/Insert_(SQL)#Retrieving_the_key

http://www.daniweb.com/web-development/databases/ms-sql/threads/299356/returning-identity-of-last-inserted-row-uniqueidentifier

维基百科说 SQL Server 2008 使用 OUTPUT 而不是 RETURNING,可以使用 OUTPUT p_key 之类的东西

【问题讨论】:

    标签: sql-server database


    【解决方案1】:

    如果您要插入一整组行,则无法选择 SCOPE_IDENTITY()。而SCOPE_IDENTITY 也仅适用于(数字)身份列 - 有时您的 PK 是别的东西......

    但 SQL Server确实OUTPUT 子句 - and it's very well documented on MSDN!

    INSERT INTO dbo.Table(columns)
    OUTPUT INSERTED.p_key, INSERTED.someothercolumnhere .......
    VALUES(...) 
    

    这些值将“回显”回调用应用程序,例如您将在 SQL Server Management Studio 的网格中看到它们,或者您可以通过调用 INSERT 语句从 C# 或 VB.NET 将它们作为结果集读取。

    【讨论】:

    • 感谢您的回答!我有一个不是数值(uuid)的主键。因为 Scope_Identity() 不起作用。
    • 那么你需要查看OUTPUT 子句的INSERT 语句。这将返回 any 数据类型 的新插入值
    • 值得注意的是,如果您要插入的表在插入时有触发器,OUPUT 将抛出错误,除非与INTO 一起使用。根据文档:“如果在未指定 INTO 关键字的情况下指定了 OUTPUT 子句,则 DML 操作的目标不能为给定的 DML 操作定义任何启用的触发器。”
    【解决方案2】:

    Scope_Identity() 是你想要的,假设“主键”是指“身份”

    declare @id int 
    insert yourtable values (some, values)
    select @id = Scope_Identity()
    

    【讨论】:

    • 作为 1 条语句,还是分成 2 条?
    • @Fallenreaper - 这些语句需要成批处理。
    【解决方案3】:

    C# 中,在您的 SQL 语句之后写上SELECT SCOPE_IDENTITY();,这样您的代码将是:

    insert into TABLE (...) values (...); SELECT SCOPE_IDENTITY();
    

    然后,使用 executeScalar 代替 executeNonQuery

    这应该可以解决问题!

    【讨论】:

    • 我实际上在使用 C#,所以它看起来像 CommandFaction cmd = new CommandFactory(); cmd.commandText = "插入 TABLE (...) 值 (...); 选择 SCOPE_IDENTITY();"; [触发查询的命令]
    • 在C#中我通常使用SqlCommand dbcm = new SqlCommand(query, dbconn); dbconn.Open();字符串插入ID = dbcm .ExecuteScalar();其中 query 是带有 select scope_identity() 的 sql 语句的字符串。确保您使用返回类型的命令而不是仅仅执行,以便您可以从结果中返回值
    • kk,我得看看我手头有什么可以使用。谢谢你的信息
    • 只要确保我上面写的语句是一个组合语句。因此“插入 TABLE (...) 值 (...); SELECT SCOPE_IDENTITY();”是一个带有语句的字符串。然后使用注释中的代码执行,其中'query' 是带有语句的字符串,而 dbconn 是 SqlStatement 类型。这是 SqlStatement 类如何工作的示例link。如果你不管理让我知道.. 如果你不要忘记做出回答:)
    【解决方案4】:

    执行插入后,查询:

    select scope_identity()
    

    检索最后插入的主键。

    【讨论】:

    • 所以我会插入数据库然后调用它,它会返回它?
    【解决方案5】:

    使用@@IDENTITY 可以得到最后生成的主键

    Insert into TableName (Name,Class) values('ABC','pqr')
    select @@IDENTITY
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 2013-06-11
      • 2011-10-11
      相关资源
      最近更新 更多