我编写了一个针对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)
我知道这应该通过首先将数据插入带有自动主键的表中,然后将数据从一个表传输到另一个表来解决,我正在寻找最好的“仅脚本”解决方案。
由于
利
答案 0 :(得分:3)
正如您所发现的那样,SQL 2008之前的VALUES
列表中不允许使用子查询。但是有一个简单的工作方式:
INSERT INTO ITEM_TABLE
SELECT TOP (1)
ISNULL(MAX(PK_COLUMN),0) + 1,
'Data 1',
@HeadSeq
FROM
ITEM_TABLE