如何在插入时为一组行生成序列号?

问题描述 投票:0回答:1

我有一个 SQL Server 表。我希望记录如下例所示。 我想按照插入的顺序检索 TrainType 值。 我正在考虑附加一个序列号列来保证检索顺序与插入顺序相匹配。

或者,我也想知道,有没有比附加序列号更好的方法??

enter image description here

这是样本插页。 这使用 xml 来填充 Speed 和 TrainType 列。 我希望将序列列添加到此插入语句中,并且我正在寻找需要填充序列号的查询

INSERT INTO BSpeedRestriction
            (UID
            ,[Version]
            ,Speed
            ,TrainType,
            *[Sequence]* <<--
)
SELECT  @UID,
        @Version,
        a.c.value('Speed[1]','int') as 'Speed',
        a.c.value('TrainType[1]/@Numeric','int') as 'TrainType',
        ??? <<--
FROM    @BSpeedsXml.nodes('/BSpeed/Restriction') a(c)
sql
1个回答
0
投票

因为您没有提供更多详细信息和 xml。我根据这个示例的假设重新创建了 XML。 据我了解,您需要对每个版本号恕我直言重置序列。所以你有多种选择。

  1. 您可以创建一个 row_number 列来存储一种自动递增的记录 id。因此,按 ID 排序将为您提供创建记录时的订单。
  2. 相同版本的预期序列列

declare @BSpeedsXml XML = N'
<BSpeed>
    <Restriction><Speed>60</Speed><TrainType>2</TrainType></Restriction>
    <Restriction><Speed>40</Speed><TrainType>1</TrainType></Restriction>
    <Restriction><Speed>40</Speed><TrainType>3</TrainType></Restriction>
    <Restriction><Speed>60</Speed><TrainType>6</TrainType></Restriction>
    <Restriction><Speed>60</Speed><TrainType>5</TrainType></Restriction>
    <Restriction><Speed>60</Speed><TrainType>4</TrainType></Restriction>

    <Restriction><Speed>60</Speed><TrainType>1</TrainType></Restriction>
    <Restriction><Speed>40</Speed><TrainType>2</TrainType></Restriction>
    <Restriction><Speed>40</Speed><TrainType>4</TrainType></Restriction>
    <Restriction><Speed>60</Speed><TrainType>5</TrainType></Restriction>
    <Restriction><Speed>60</Speed><TrainType>6</TrainType></Restriction>
    <Restriction><Speed>60</Speed><TrainType>3</TrainType></Restriction>
</BSpeed>'

Declare @UID int = 115967

select 
    ID
    ,UID
    ,Version = case when ID <= 6 then 1 else 2 end
    ,x.Speed
    ,x.TrainType
    --that would create a sequence number as expected (i would assume it should be reset on each version)
    ,SequenceNum = ROW_NUMBER() OVER (partition by case when ID <= 6 then 1 else 2 end ORDER by UID)
FROM (
    SELECT  --can have a row number to create as sequence
            ID = ROW_NUMBER() OVER (ORDER by (select 1))
            ,UID = @UID,
            Version = null,
            Speed = a.c.value('Speed[1]','int'),
            TrainType = a.c.value('TrainType[1]','int')
    FROM    @BSpeedsXml.nodes('/BSpeed/Restriction') a(c)
    ) x

结果:

身份证号码 UID 版本 速度 列车类型 序列号
1 115967 1 60 2 1
2 115967 1 40 1 2
3 115967 1 40 3 3
4 115967 1 60 6 4
5 115967 1 60 5 5
6 115967 1 60 4 6
7 115967 2 60 1 1
8 115967 2 40 2 2
9 115967 2 40 4 3
10 115967 2 60 5 4
11 115967 2 60 6 5
12 115967 2 60 3 6
© www.soinside.com 2019 - 2024. All rights reserved.