2013-04-04 98 views
1

我正在嘗試執行以下操作,但得到「無效的列名{列}」錯誤。有人能幫我看看我的方式錯誤嗎?我們最近將一個交易表分成兩個表格,一個包含經常更新的報告列名稱,另一個包含不變的交易。這讓我試圖改變一個簡單的插入到一個表中的複雜插入到具有唯一列的兩個表中。我試圖做到這一點,像這樣:從單表插入多個表,無效的列名稱錯誤

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」是錯誤的根源,有或沒有「插入」前面。

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

Aaron是正確的,它是無法用插入來管理,但我能夠極大地改進插入的功能,並使用合併功能添加其他業務規則。我的最終解決方案類似於以下內容:

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; 

希望在未來幫助其他人。 :)

+0

你可以在這裏查看我的示例:http://granadacoder.wordpress.com/2008/12/10/sqlserver20052008-output-clause-in-insertupdatedelete-statements/ – granadaCoder 2013-04-04 14:25:29

回答

0

我相當肯定,你將需要有兩個刀片(或創建一個視圖並使用一個而不是插入觸發器)。您只能使用OUTPUT子句發送變量或實際插入的值爲另一個表。在插入期間,不能使用它將選擇分割爲兩個目標表。

如果您提供了更多信息(如表格被拆分以及行如何關聯),我們可以提供更具體的答案。

+0

有1對多關係,其中1個報告列鏈接到多個事務。它最初是一個具有名稱,類型,分類,日期和金額的單一交易表,但隨時更新每一個交易的名稱,類型或分類更新的開銷非常大,因此我將其分成了一張可更新的表和一個這隻會(大部分)寫入。我想我最終需要從源合併到ReportColumns表,然後從該合併的輸出插入到交易表中。 – notJoeKing 2013-04-04 14:52:27

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 
+0

我認爲重點是日期/金額列在不同的表中,所以這個插入不起作用。 – 2013-04-04 13:41:54