TSQL - 选择插入的行

Posted

技术标签:

【中文标题】TSQL - 选择插入的行【英文标题】:TSQL - select inserted rows 【发布时间】:2013-05-19 19:55:15 【问题描述】:

有没有办法选择插入的行?我正在尝试使用SqlCommand 运行以下查询(它用于在数据库中保留给定的 id):

INSERT INTO tbl (id)
SELECT COUNT(*) + 1 AS id from tbl

有没有办法返回插入的 id 列,以便我可以在我的应用程序中使用它?或者也许有更简单的方法可以实现这一目标?我必须绝对确定我保留了免费 ID,即使多个用户会同时使用该应用。

另外,有没有办法可以更改查询以选择第一个空闲 id,这样我就可以避免空白?

【问题讨论】:

您为什么首先生成和保留 ID?听起来您真正想要解决的问题就是您这样做的原因。数据库已经有 auto-id 列,当你插入时会生成一个新的唯一 ID。 当我将进行一系列与新行相关的更新并且唯一的关键列是 ID 列时,我还能如何确保我将对单行进行操作? ***.com/questions/42648/… 可能对插入数据后如何获取身份感兴趣。这样,一旦您插入数据,数据库就可以生成一个 id,您可以检索它以进行下一步操作。 【参考方案1】:

您可以轻松地使用OUTPUT 子句输出例如新创建的 ID 作为结果集,您可以使用标准 SqlDataReader 从您的 C# 应用程序中读取这些 ID:

INSERT INTO tbl (id)
OUTPUT Inserted.Id
   SELECT COUNT(*) + 1 AS id from tbl

更新:OUTPUT 子句返回的数据可以从 C# 端捕获,就像它是常规的 SELECT 语句一样:

string insertStmt = "INSERT INTO tbl (id) " + 
                    " OUTPUT Inserted.Id " + 
                    " SELECT COUNT(*) + 1 AS id from tbl";

using (SqlConnection conn = new SqlConnection(-your-connection-string-here-))
using (SqlCommand cmd = new SqlCommand(insertStmt, conn))

    conn.Open();

    // execute your INSERT statement into a SqlDataReader
    using(SqlDataReader reader = cmd.ExecuteReader())
    
        // read the values returned from the OUTPUT clause
        while(reader.Read())
        
            int insertedID = reader.GetInt32(0);
            // do something with those values....                
        
    

    conn.Close();

【讨论】:

您能否详细说明如何捕获输出?据我所知,SqlCommand 既可以返回数据也可以操作它,而不是两者兼而有之。 在 SSMS 中使用也超级方便! OUTPUT Inserted.* 显示您刚刚插入的所有内容。很好的提示,谢谢!【参考方案2】:

如果id 是标识列,则可以使用SCOPE_IDENTITY()MAX(id) 获取最新的记录id,但这不会解决任何问题。在您获取该记录时,可能会插入另一条记录。此外,如果您想获取插入的行,一种方法是通过Triggersinserted 关键字。但是尝试保留 id 是没有用的,因为标识列每次都返回一个唯一的 id。

【讨论】:

SCOPE_IDENTITY() 不是全局的,因此如果您只插入一条记录,则可以在范围内使用它来获取 id 值。您不必担心同时插入其他范围。在此处查看更多信息***.com/questions/1920558/…

以上是关于TSQL - 选择插入的行的主要内容,如果未能解决你的问题,请参考以下文章

TSQL 帮助 | INSERT 语句的选择列表包含的项目少于插入列表 [关闭]

TSQL - 排除与临时表匹配的行

TSQL - 选择内的While循环?

TSQL获取刚刚插入的行的SQL Autonumber ID

tsql 将列合并到一张表中

TSQL:有没有办法限制返回的行并计算在没有限制的情况下返回的总数(不将其添加到每一行)?