2

这是我的示例表,主键是 Akey+Bkey 的复合键

Akey Bkey ItemSequence    
---- ---- ------------
1 1 1
1 5 2
1 7 3
2 7 1
3 2 1
3 3 2

Akey 是从 SQL 2012 序列对象 ASequence 生成的。在大多数情况下,我一次插入一行,必要时我调用 NEXT VALUE FOR ASequence。但是我需要从如下语句中插入:

SELECT DENSE_RANK() OVER ( ORDER BY Something) 作为 AKey,
    Bkey,序列
从表 B

NEXT VALUE 的 OVER 子句不能以这种方式工作,因为我需要能够将记录作为 SET 插入,但每个 DENSE_RANK 集只增加一次序列。所以我们有 ALTER SEQUENCE 命令,通过它我可以将序列设置为我想要的。需要注意的是,它必须是一个常量,并且不接受变量。我的解决方法是:

声明 @startingID INT
声明 @sql VARCHAR(MAX)
声明@newSeed INT

SET @startingID = ASequence 的下一个值

插入表格
SELECT DENSE_RANK() OVER ( ORDER BY Something) + @startingID 作为 AKey,
    Bkey,序列
从表 B

从表中选择 @newSeed = MAX(Akey)

SET @sql = 'ALTER SEQUENCE ASEQUENCE RESTART WITH ' + cast(@newSeed+1 as varchar(10))
执行(@sql)

像这样在动态 SQL 中使用 DML 语句似乎很糟糕。有一个更好的方法吗?

4

2 回答 2

0

或者,这个怎么样:

CREATE TABLEA
(
    GroupID INT,
    AKey INT,
    BKey INT,
    ItemSequence INT, 
    CONSTRAINT PK_TABLEA PRIMARY KEY CLUSTERED 
    (
        GroupID,
        AKey,
        BKey 
    )
)

DECLARE @GroupID INT
SET @GroupID = NEXT VALUE FOR ASequence

INSERT TABLEA
SELECT @GroupID, DENSE_RANK() OVER ( ORDER BY Something) as AKey,
    Bkey, Sequence
FROM TABLEB

如果您需要示例中的 AKey 的值,则可以在此处执行 GroupID+AKey。

于 2013-07-06T06:05:03.373 回答
0

这应该这样做:

INSERT TABLEA
SELECT NEXT VALUE FOR ASequence OVER(ORDER BY Something) as AKey,
    Bkey, Seq
FROM TABLEB
于 2013-07-04T00:08:09.167 回答