您可以使用 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