SELECT 语句可以同时返回数据和 INSERT 到另一个 SQL 表吗?

下面查询两次读取相同数据的Customer表;

  1. 要将选定的字段插入临时表以供以后使用,以及
  2. 将数据输出到调用它的应用程序

SQL SELECT 语句是否有任何变体可以同时实现这两个目标? (即没有读取数据两次?)

declare @CustomerID int = 1234
declare @IDsFromCustomer1 table (CustomerID int,TerritoryID int)

--IDs from Customer table
insert into @IDsFromCustomer1(CustomerID,TerritoryID)
    select CustomerID,TerritoryID
    from [Customer] 
    where [Customer].CustomerID = @CustomerID

--Return Customer table
    select [Customer].*
    from [Customer] 
    where [Customer].CustomerID = @CustomerID
miaoxiaoyun5211314 回答:SELECT 语句可以同时返回数据和 INSERT 到另一个 SQL 表吗?

您可以使用 INSERT 语句的 OUTPUT 子句

declare @CustomerID int = 1234
declare @IDsFromCustomer1 table (CustomerID int,TerritoryID int)

insert into @IDsFromCustomer1(CustomerID,TerritoryID)
output inserted.*
    select @CustomerID CustomerID,@CustomerID TerritoryID;

select * from @IDsFromCustomer1;

此脚本返回 2 个相同的查询输出。首先,从 INSERT 语句的 OUTPUT 返回一行。其次,所有行都从@IDsFromCustomer1 返回。

,

您有三个选择。

首先是将所有必需的列选择到 @table variable 中 - 您真的需要 select * 吗?然后您可以直接从 @IDsFromCustomer1 返回数据。

您需要根据每种情况下的表宽度和逻辑读取来试验有效性。使用 set statistics io on 将向您显示逻辑读取,您也可以在 SSMS 的执行计划的属性中看到这一点。

您可能有帮助的第二个选项是使用表变量,而是声明一个实际的 #temp table

然后您可以通过选择 from #IDsFromCustomer1 并返回您的 Customer 表来返回您的数据。

使用临时表的好处是 SQL Server 具有数据统计信息和最佳执行计划,此外,您还可以从临时表上的聚集索引中受益。

测试哪些产生较低的逻辑读取将(在大多数情况下)突出最佳实现。

第三个选项可能如 Dale 在评论中提到的那样适合您,具体取决于您在何时希望获得临时表数据以及何时想要输出结果的使用情况。

使用 merge,您可以同时插入您的数据和 output 数据。

例如您可以执行以下操作

merge @IDsFromCustomer1 as t
using (
  select *
  from Customer
  where CustomerID = @CustomerID
) as s on 1=1
when not matched then
insert (CustomerID,TerritoryID) values (s.CustomerID,s.TerritoryID)
output s.*;
本文链接:https://www.f2er.com/2572.html

大家都在问