问题信息
详细问题
我能解释我问题的最好方法是解释我想要的结果.我正在尝试使用某组办公室,将其数据插入dbo.DeliveryLocation表,然后输出inserted.DeliveryLocationId并使用该id更新相应office的DeliveryLocationId字段.
期望的结果例子
办公室数据之前
OfficeId | DeliveryLocationId
-----------------------------
1 | null
2 | null
3 | null
Run the SQL statement
办公室数据之后
OfficeId | DeliveryLocationId
-----------------------------
1 | 5
2 | 6
3 | 7
>使用Delivery创建DeliveryLocationId的交货地点
OfficeId为1的Office数据
>使用Delivery创建了DeliveryLocationId为6的交付位置
OfficeId为2的Office数据
>使用Delivery创建了DeliveryLocationId为7的交付位置
办公室的数据,OfficeId为3
问题
根据我下面的当前SQL脚本,您可以看到我的第一部分(将Office数据插入交付位置表)完成.第二部分(使用创建的交付位置的相应DeliveryLocationId更新Office)未完成,我不确定如何执行此操作.
我最初的想法/解决方案
如果有一种方法来存储相关的OfficeId和DeliveryLocationId,也许我们可以循环遍历它们并在第二个SQL语句中更新办公室,而不是尝试创建一个完成所有操作的SQL语句.
参考
dbo.DeliveryLocation
[DeliveryLocationId] [int] IDENTITY(1,1) NOT NULL,
[LocationName] [nvarchar](max) NULL,
[ShortName] [nvarchar](max) NULL,
[ValidatedAddressId] [int] NOT NULL,
[DropoffInstruction] [nvarchar](max) NULL,
[PickupInstruction] [nvarchar](max) NULL,
[TaxRate] [decimal](18, 2) NOT NULL,
[Active] [bit] NOT NULL,
[DisableOffices] [bit] NOT NULL
dbo.Office
[OfficeId] [int] IDENTITY(1,1) NOT NULL,
[OfficeName] [nvarchar](max) NULL,
[ValidatedAddressId] [int] NOT NULL,
[ReferralSource] [nvarchar](max) NOT NULL,
[NumberOfEmployees] [int] NOT NULL,
[DeliveryLocationId] [int] NULL
当前的SQL
insert into
dbo.DeliveryLocation
(LocationName, ShortName, ValidatedAddressId, Active, DisableOffices)
output
inserted.DeliveryLocationId
select
OfficeName, OfficeName, ValidatedAddressId, 0, 0
from
dbo.Office as o
where
OfficeId in
(
select distinct
OfficeId
from
dbo.[User] as u
where
u.DeliveryLocationId is null
and
u.OfficeId is not null
)
最佳答案 我不确定在INSERT语句中执行此操作,但如果您使用使用Office(或基于Office的查询)作为源的MERGE语句,您将能够引用source.OfficeId以及插入. OUTPUT子句中的DeliveryLocationId.您可以简单地跳过更新并删除MERGE的用法,并且只使用ON NOT MATCHED子句.
当我做这样的事情时,我将输出放入临时表,然后执行我需要做的任何进一步的更新或插入.
如果您以前没有使用MERGE语句(或者甚至没有使用过所有功能的人),这是一个非常棒的资源,如何使用它们,以及如何使用它们:http://www.made2mentor.com/2012/07/got-the-urge-to-merge/