如何在SQL Server中实现INSERT INTO自增

3
我正在尝试使用查询将表A中的数据插入到表B中。
INSERT INTO tableB(Status, UserIn, TableBID, Name)
    SELECT 
        'Active',
        UserInput,
        COALESCE(MAX(TableAID),0)+1,
        Name
    FROM 
        tableA

但我遇到了一个错误:
无效的列名'TableAID'。
这是我的TableA:
CREATE TABLE TableA  
(
    Status VARCHAR(10),
    UserInput VARCHAR(25),
    TableAID INT,
    Name VARCHAR(32)
)

还有我的表B

CREATE TABLE TableB
(
    Status VARCHAR(1),
    UserIn VARCHAR(25),
    TableBID INT,
    Name VARCHAR(32)
)

你能提供表A的DDL吗? - streetturtle
问题已编辑@streetturtle - Kentgi
你想具体做什么? - Vijunav Vastivch
根据您的问题,您的错误是因为在TableB中实际上没有名为TableBID的列。尽管您的DDL表明您有这个列。您需要发布正确的SQL和DDL,因为它们目前是相互矛盾的。您还需要在更高层次上发布您实际要做的事情,即将这些行加载到此表中,生成新的ID。 - Nick.McDermaid
在编辑查询后,您是否仍然收到相同的错误? - STLDev
2个回答

10

你之所以会收到那个错误是因为你正在从没有TableBID列的tableA中选择。据我理解,你正在尝试从tableA中插入每一行并获取最大的tableBID,并将其增加一,你可以尝试以下方法:

INSERT INTO tableB(Status,UserIn,TableBID,Name)
SELECT 
'Active',
UserInput,
ROW_NUMBER() OVER (order by (select 1))+ (SELECT COALESCE(MAX(TableBID),0) FROM tableB ),
Name
FROM 
tableA

ROW_NUMBER() OVER (order by (select 1))会为从tableA插入的每一行返回从1开始递增的数字。


我已经编辑了问题。但是这个答案是可以接受的!谢谢回复! - Kentgi
1
通常的做法是在目标表中创建一个“identity”列,但只要您不执行两次查询,这肯定足够了。 - Nick.McDermaid
一个很棒的解决方案。 - Eray Balkanli

4

我注意到两件事情。首先,看起来你想要将5个字符的数据插入到一个varchar(1)列中作为Status的值。也许你应该改变列长度或者你要插入的数据。

其次,你在使用MAX聚合函数时有多个列,并没有使用GROUP BYOVER语句。


谢谢您纠正我,也感谢您的建议... :) - Kentgi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接