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,但这不会解决任何问题。在您获取该记录时,可能会插入另一条记录。此外,如果您想获取插入的行,一种方法是通过Triggers
或inserted
关键字。但是尝试保留 id 是没有用的,因为标识列每次都返回一个唯一的 id。
【讨论】:
SCOPE_IDENTITY() 不是全局的,因此如果您只插入一条记录,则可以在范围内使用它来获取 id 值。您不必担心同时插入其他范围。在此处查看更多信息***.com/questions/1920558/…以上是关于TSQL - 选择插入的行的主要内容,如果未能解决你的问题,请参考以下文章
TSQL 帮助 | INSERT 语句的选择列表包含的项目少于插入列表 [关闭]