从sql中的一个select语句将数据插入多个表

时间:2015-03-04 15:34:10

标签: sql sql-server

我需要通过select语句将数据插入到两个不同的表中。这个select语句调用内联TVF。

到目前为止我所拥有的是:

INSERT INTO #Temp2 (RowNumber, ValFromUser, ColumnName, ValFromFunc, FuncWeight, percentage)
  SELECT 
     RowNumber, @hospitalname, 'hospitalname', 
     PercentMatch, @constVal, PercentMatch * @constVal 
  FROM   
     dbo.Matchhospitalname (@hospitalname)

但是有些列需要提供给永久表dbo.Cache

在程序中多次调用上述查询。

Insert into dbo.Cache(StringSearched, ColName, RowId, PercentMatch) 
   select 
      ValFromUser, ColumnName, RowNumber, Max(ValFromFunc) as Percentage    
   from 
      #Temp2 
   group by 
      ValFromUser, ColumnName, RowNumber

如上所述,将数据分别添加到dbo.Cache会使所有先前添加的值在执行此语句时添加多次,这当然是不可取的。

可能是因为根本不可能通过一个select向两个表添加数据,我们可以做一些事情,比如只添加那些只在最后一个insert语句中添加的行?

我可以就此获得一些指示吗?

编辑:根据建议,我尝试以这种方式使用OUTPUT INTO,但Group by似乎位于错误的位置。分组的行只能插入dbo.Cache而不是#Temp2

我该如何解决这个问题?

INSERT INTO #Temp2 (RowNumber,ValFromUser,ColumnName,ValFromFunc,FuncWeight,percentage)OUTPUT
    INSERTED.ValFromUser,
    INSERTED.ColumnName,
    INSERTED.RowNumber,
    MAX(INSERTED.ValFromFunc)
  INTO dbo.CACHE
  (StringSearched, ColName, RowId, PercentMatch)
  Group By Inserted.ValFromUser, Inserted.ColumnName, Inserted.RowNumber 
      SELECT RowNumber,@firstname,'firstname',PercentMatch,@constVal,PercentMatch * @constVal FROM   dbo.MatchFirstName(@firstname)

1 个答案:

答案 0 :(得分:1)

您可以通过输出子句执行此操作,或者通常可以在表上放置触发器。换句话说,您可以在临时表'#temp2'上创建一个后插入触发器。我从来没有在临时表上看过触发器,但它可能。每次重新创建临时表时,都必须重新创建触发器。请记住,#temp2只会在创建它的会话中存在(并且可见)。