Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从单个表插入多个表,列名无效错误_Sql Server_Tsql_Insert - Fatal编程技术网

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

Sql server 从单个表插入多个表,列名无效错误,sql-server,tsql,insert,Sql Server,Tsql,Insert,我正在尝试执行以下操作,但得到一个无效的列名{Column}错误。有人能帮我看清我的错误吗?我们最近将一个事务表拆分为两个表,一个包含经常更新的报告列名,另一个包含不变的事务。这使我试图将简单的插入1个表的操作更改为复杂的插入2个具有唯一列的表的操作。我试图这样做: INSERT INTO dbo.ReportColumns ( FullName ,Type ,Classification ) OUTPUT INSERTED.Date, INSERTED.Amount,

我正在尝试执行以下操作,但得到一个无效的列名{Column}错误。有人能帮我看清我的错误吗?我们最近将一个事务表拆分为两个表,一个包含经常更新的报告列名,另一个包含不变的事务。这使我试图将简单的插入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}
插入的.Date、INSERTED.Amount是错误的来源,无论是否插入。在前面

---------更新---------

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

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;
希望将来能帮助别人

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

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


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

我很确定您需要两个插入或创建一个视图,并使用insert而不是insert触发器。只能使用OUTPUT子句将变量或实际插入值发送到另一个表。在插入过程中,不能使用它将select拆分为两个目标表


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

我认为关键是日期/金额列位于不同的表格中,因此此插入不起作用。我认为关键是日期/金额列位于不同的表格中,因此,此插入无效。您可以在此处签出我的示例:您可以在此处签出我的示例:存在一对多关系,其中一个报表列链接到多个事务。它最初是一个包含名称、类型、分类、日期和金额的单一事务表,但每当更新名称、类型或分类时,更新每个事务的开销都是巨大的,因此我将其拆分为一个可以更新的表和一个大部分只会写入的表。我想我最终需要从源代码合并到ReportColumns表,然后从合并的输出插入到Transactions表?存在1对多关系,其中1个报告列链接到多个事务。它最初是一个包含名称、类型、分类、日期和金额的单一事务表,但每当更新名称、类型或分类时,更新每个事务的开销都是巨大的,因此我将其拆分为一个可以更新的表和一个大部分只会写入的表。我想我最终需要从源代码合并到ReportColumns表,然后从合并的输出插入到Transactions表?