从单个表插入多个表,无效的列名错误

时间:2013-04-04 13:36:50

标签: sql-server tsql insert

我正在尝试执行以下操作,但收到“无效的列名{列}}”错误。有人可以帮我看看我的错误吗?我们最近将一个事务表拆分为2个表,一个表包含经常更新的报表列名,另一个表包含不变的事务。这让我试图将简单插入到1个表中的内容更改为复杂插入到具有唯一列的2个表中。我试图这样做:

INSERT INTO dbo.ReportColumns
(
    FullName
    ,Type
    ,Classification
)
OUTPUT INSERTED.Date, INSERTED.Amount, INSERTED.Id INTO dbo.Transactions
SELECT
    [Date]
    ,Amount
    ,FullName
    ,Type
    ,Classification
FROM {multiple tables}

“INSERTED.Date,INSERTED.Amount”是错误的来源,有或没有“INSERTED”。在前面。

----------------- UPDATE ------------------

Aaron是正确的,用插件管理是不可能的,但是我能够大大改进插件的功能,并使用Merge功能添加一些其他业务规则。我的最终解决方案类似于以下内容:

DECLARE @TransactionsTemp TABLE
(
    [Date] DATE NOT NULL,
    Amount MONEY NOT NULL,
    ReportColumnsId INT NOT NULL
)

MERGE INTO dbo.ReportColumns AS Trgt
USING ( SELECT
            {FK}
    ,[Date]
    ,Amount
    ,FullName
    ,Type
    ,Classification
FROM {multiple tables}) AS Src
ON Src.{FK} = Trgt.{FK} 
WHEN MATCHED THEN
    UPDATE SET 
    Trgt.FullName = Src.FullName,
    Trgt.Type= Src.Type,
    Trgt.Classification = Src.Classification
WHEN NOT MATCHED BY TARGET THEN
    INSERT
    (
        FullName,
        Type,
        Classification
    )
    VALUES
    (
        Src.FullName,
        Src.Type,
        Src.Classification
    )
OUTPUT Src.[Date], Src.Amount, INSERTED.Id INTO @TransactionsTemp;

MERGE INTO dbo.FinancialReport AS Trgt
USING (SELECT
      [Date] ,
          Amount ,
          ReportColumnsId
          FROM @TransactionsTemp) AS Src
ON Src.[Date] = Trgt.[Date] AND Src.ReportColumnsId = Trgt.ReportColumnsId
WHEN NOT MATCHED BY TARGET And Src.Amount <> 0 THEN
        INSERT
        (
            [Date],
            Amount,
            ReportColumnsId
        )
        VALUES
        (
            Src.[Date],
            Src.Amount,
            Src.ReportColumnsId
        )
WHEN MATCHED And Src.Amount <> 0 THEN
        UPDATE SET Trgt.Amount = Src.Amount
WHEN MATCHED And Src.Amount = 0 THEN
        DELETE;

希望将来帮助别人。 :)

2 个答案:

答案 0 :(得分:1)

Output子句将返回您要插入表中的值,需要多次插入,您可以尝试类似下面的内容

declare @staging table (datecolumn date, amount decimal(18,2),
                       fullname varchar(50), type varchar(10), 
                       Classification varchar(255));

INSERT INTO @staging
SELECT
    [Date]
    ,Amount
    ,FullName
    ,Type
    ,Classification
FROM {multiple tables}

Declare @temp table (id int, fullname varchar(50), type varchar(10));
INSERT INTO dbo.ReportColumns
(        
    FullName
    ,Type
    ,Classification
)
OUTPUT INSERTED.id, INSERTED.fullname, INSERTED.type INTO @temp
SELECT
    FullName
    ,Type
    ,Classification
FROM @stage

INSERT into dbo.transacrions (id, date, amount)
select t.id, s.datecolumn, s.amount from @temp t
inner join @stage s on t.fullname = s.fullname and t.type = s.type

答案 1 :(得分:0)

我相当肯定你需要有两个插入(或创建一个视图并使用而不是插入触发器)。您只能使用OUTPUT子句发送变量或实际插入值 ti另一个表。在插入过程中,不能使用它将select分成两个目标表。

如果您提供更多信息(例如表格如何拆分以及行如何相关),我们可能会提供更具体的答案。