2017-04-05 141 views
1

我想获取插入记录的行号,以便我可以将它用于select语句。我试图完成的是将一个人插入到一个表中,获取该行号,然后从行号匹配的另一个表中选择一些内容。以下是我走到这一步:SQL获取插入行的行号

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) 

我如何插入项的行号,我想作为一些记录可能已被删除,这样他们就不会匹配比较IDS。

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

我在存储过程中这样做。

+0

你有''TableA'列rownum'? –

+0

呃......我想你可能会对SQL Server如何存储数据有些困惑。行本身并不具有“行号”。 – ZLK

+0

否我在表A中没有rownum列 – user979331

回答

3
  1. 除非包含ORDER BY子句,否则认为行具有数字是错误的。
  2. 在插入行后查找行的唯一方法是搜索它。推测你的桌子有一个主键;用它来搜索它。
+0

是的,我的主键像一个id,在删除记录的情况下我该怎么办,TableA主键列可以在51或3开始,并且不会匹配TableB的tokenOrder。 – user979331

+0

通过你试图做的声音像以下链接上列出的东西[链接](http://stackoverflow.com/questions/7917695/sql-server-return-value-after-insert) 基本上: 'INSERT INTO TableA(Person) OUTPUT插入.ID VALUES('bob');' – David

+0

@David我已经看到了,但在timeToken为false的情况下我该怎么办?例如凌晨3点被采取,所以如果即使我重新启动主键完成后,ID不会匹配tokenOrder我试图得到 – user979331

0

通过它你试图做这样的事情是什么上市thhe以下链接LINK的声音 - SQL Server - Return value after INSERT

基本上是:

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

我已经看到了,但在timeToken为false的情况下我该怎么办?例如凌晨3点被采取,所以如果即使我重新启动主键完成后,ID不会匹配tokenOrder我想获得 – user979331

0

试试这个。它可以帮助你

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 [email protected]_PK 

SCOPE_IDENTITY():范围身份将捕获最后插入的记录的主键值和其可以被存储在varaible和 ,然后它可以用于进一步的重新使用

+0

但我的ids可能不是1,2,3,4,5,6它可能是像这样5,6,7,9,11,14,17 – user979331

+0

你的表coulmn没有'IDENTITY' .. ??表A中的 –

+0

timeToken?否 – user979331

0

添加外键约束(引用在表的主键)的表b会很好,因为如果不从表B删除记录,就不能从表B中删除记录,这有助于使用标识比较记录。

+0

我可以看到@ Coder1991的示例 – user979331

+0

@ user979331使用alter语句在表b中添加列id1,如下所示。 alter table table b add id1 int null。添加外键约束,如下所示。 atler table table b添加约束fk_tbl_b外键(id1)引用表A(id) – Coder1991

+0

我可以从任何一个或表B中删除,timeTokens可以标记为已采用,然后我不想包含它们。 – user979331

0

试试这个

declare @rowNum int; 

INSERT INTO TableA Values ('Person') 

SET @rowNum =SCOPE_IDENTITY() 

select * from TableA where id = @rowNum