带有计算主键的T-SQL多次插入

时间:2012-01-25 09:32:44

标签: tsql

我编写了一个针对SQL 2008的脚本,该脚本运行良好:

INSERT INTO ITEM_TABLE VALUES((SELECT ISNULL(MAX(PK_COLUMN),0) + 1
FROM ITEM_TABLE), 'Data 1', @HeadSeq)
INSERT INTO ITEM_TABLE VALUES((SELECT ISNULL(MAX(PK_COLUMN),0) + 1
FROM ITEM_TABLE), 'Data 2', @HeadSeq)
...
INSERT INTO ITEM_TABLE VALUES((SELECT ISNULL(MAX(PK_COLUMN),0) + 1
FROM ITEM_TABLE), 'Data 73', @HeadSeq)

然而在2005年,它为每一行提供了这个错误:

  

在此上下文中不允许使用子查询。只允许使用标量表达式。

有没有更好的解决方法而不是做以下事情? (这会让中间位置变得困难)

DECLARE @SequenceCounter INT
SELECT @SequenceCounter = ISNULL(MAX(PK_COLUMN),0) FROM ITEM_TABLE

INSERT INTO ITEM_TABLE VALUES(@SequenceCounter + 1, 'Data 1', @HeadSeq)

INSERT INTO ITEM_TABLE VALUES(@SequenceCounter + 2, 'Data 2', @HeadSeq)
...
INSERT INTO ITEM_TABLE VALUES(@SequenceCounter + 73, 'Data 73', @HeadSeq)

我知道这应该通过首先将数据插入带有自动主键的表中,然后将数据从一个表传输到另一个表来解决,我正在寻找最好的“仅脚本”解决方案。

由于

1 个答案:

答案 0 :(得分:3)

正如您所发现的那样,SQL 2008之前的VALUES列表中不允许使用子查询。但是有一个简单的工作方式:

INSERT INTO ITEM_TABLE 
SELECT TOP (1) 
    ISNULL(MAX(PK_COLUMN),0) + 1, 
    'Data 1', 
    @HeadSeq
FROM
    ITEM_TABLE