【问题标题】:SQL Get the row number of the inserted rowSQL 获取插入行的行号
【发布时间】:2017-04-05 13:47:23
【问题描述】:

我正在尝试获取插入记录的行号,以便将其用于选择语句。我想要完成的是将一个人插入一个表中,获取该行号,然后从另一个表中选择行号匹配的内容。这是我到目前为止得到的:

INSERT INTO TableA Values (‘Person’)

Select timeToken
From 
(
    Select 
      Row_Number() Over (Order By tokenOrder) As RowNum
    , *
    From TableB WHERE taken = false
) t2
Where RowNum = (Row Number of Inserted Item)

如何获取插入项的行号,我想比较 id,因为某些记录可能已被删除,因此它们不匹配。

TABLEA Data (primary key is id)

id name
3 John
12 Steve

TABLEB Data (primary key is id)

id timeToken tokenOrder taken
2   1:00am    1          false
3   2:00am    2          false
5   3:00am    3          true
6   4:00am    4          false

我插入人员时的预期结果,选择会返回凌晨 4:00

我在存储过程中这样做。

【问题讨论】:

  • TableA 中有rownum 列吗?
  • 呃...我想您可能对 SQL Server 如何存储数据有些困惑。行本身并不具有“行号”。
  • 不,我在 TableA 中没有 rownum 列
  • 添加样本数据和预期结果
  • 我添加了示例数据并期待结果

标签: sql sql-server


【解决方案1】:
  1. 除非包含ORDER BY 子句,否则认为行有数字是错误的。
  2. 在插入一行后找到它的唯一方法是搜索它。大概你的表有一个主键;用它来搜索它。

【讨论】:

  • 是的,我的主键就像一个id,在删除记录的情况下我该怎么办,TableA的主键列可能从51或3开始,并且与TableB的tokenOrder不匹配
  • 从它的声音来看,您正在尝试执行以下链接LINK 中列出的内容:'INSERT INTO TableA (Person) OUTPUT Inserted.ID VALUES('bob'); '
  • @David 我已经看到了,但是如果 timeToken 为假,我该怎么办?以凌晨 3:00 为例,所以即使我在完成后重新启动主键,id 也不会与我试图获取的 tokenOrder 匹配
  • 糟糕,对不起!我多次发布这个问题。我的意思是只发表一条评论。我没有立即给你答案。
【解决方案2】:

试试这个。它可能会帮助你

Declare @TableA_PK BIGINT

INSERT INTO TableA Values ('Person')

SET @TableA_PK=SCOPE_IDENTITY()

Select timeToken
From 
(
    Select 
      Row_Number() Over (Order By tokenOrder) As RowNum
    , *
    From TableB WHERE taken = false
) t2
Where RowNum =@TableA_PK

SCOPE_IDENTITY(): Scope Identity 将捕获最后插入的记录主键值,它可以存储在一个变量中,并且 然后它可以进一步重复使用

【讨论】:

  • 但我的 id 可能不是 1,2,3,4,5,6 它可能是这样的 5,6,7,9,11,14,17
  • 你的表没有IDENTITY ..??
  • 表A中的timeToken?没有
  • 我在问您的表中是否有任何列作为自动增量(IDENTITY ON)功能......?
  • 是的,我的 id 列是自动递增主键,但是如果我删除测试记录,它会开始很奇怪
【解决方案3】:

听起来你正在尝试做一些类似下面链接LINK-SQL Server - Return value after INSERT中列出的事情

基本上:

INSERT INTO TableA (Person)
OUTPUT Inserted.ID
VALUES('bob');

【讨论】:

  • 我已经看到了,但是如果 timeToken 为假,我该怎么办?以凌晨 3:00 为例,所以即使我在完成后重新启动主键,id 也不会与我试图获取的 tokenOrder 匹配
【解决方案4】:

在表 b 中添加外键约束(引用表 A 中的主键)会很好,因为如果不从表 B 中删除记录,您将无法从表 A 中删除记录。这将有助于比较使用 ID 记录。

【讨论】:

  • 我可以看看这个@Coder1991的例子
  • @user979331 使用下面的 alter 语句在表 b 中添加列 id1。更改表表 b 添加 id1 int null。添加外键约束,如下所示。 atler table table b 添加约束 fk_tbl_b foreign key(id1) references table A(id)
  • 我可以从其中一个或表 B 中删除,timeTokens 可以标记为已使用,然后我不想包含它们。
  • @user979331 您是否要对存储过程中的两个表中的任何一个执行删除操作?如果是这样,删除操作的目的是什么。
  • 哦不在存储过程中。我将提前删除测试记录,并且一些 timeTokens 将被标记为已使用。
【解决方案5】:

试试这个

declare @rowNum int;

INSERT INTO TableA Values ('Person')

SET @rowNum =SCOPE_IDENTITY()

select * from TableA  where id = @rowNum

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 2014-08-23
    • 2013-06-23
    • 2010-12-28
    • 2012-01-23
    • 1970-01-01
    相关资源
    最近更新 更多