1

次のことをしようとしていますが、「列名 {column} が無効です」というエラーが表示されます。誰かが私のやり方の誤りを見るのを手伝ってくれませんか? 最近、トランザクション テーブルを 2 つのテーブルに分割しました。1 つは頻繁に更新されるレポートの列名を含み、もう 1 つは変更されていないトランザクションを含みます。これにより、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」の有無にかかわらず、エラーの原因です。前に。

- - - - - - - - -アップデート - - - - - - - - -

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;

将来、他の誰かに役立つことを願っています。:)

4

2 に答える 2

0

2 つの挿入が必要になることは間違いありません (または、ビューを作成し、代わりに挿入トリガーを使用します)。変数または実際に挿入された値を別のテーブルに送信するには、OUTPUT 句のみを使用できます。挿入中に選択を 2 つの宛先テーブルに分割するために使用することはできません。

詳細情報 (テーブルがどのように分割されているか、行がどのように関連付けられているかなど) を提供していただければ、より具体的な回答を提供できる可能性があります。

于 2013-04-04T13:43:44.380 に答える