I have the following table structures
CREATE TABLE [dbo].[WorkItem](
[WorkItemId] [int] IDENTITY(1,1) NOT NULL,
[WorkItemTypeId] [int] NOT NULL,
[ActionDate] [datetime] NOT NULL,
[WorkItemStatusId] [int] NOT NULL,
[ClosedDate] [datetime] NULL,
)
CREATE TABLE [dbo].[Requ开发者_如何学JAVAirementWorkItem](
[WorkItemId] [int] NOT NULL,
[RequirementId] [int] NOT NULL,
)
CREATE TABLE #RequirmentWorkItems
(
RequirementId int,
WorkItemTypeId int,
WorkItemStatusId int,
ActionDate datetime
)
I use the #RequirmentWorkItems
table to create workitems for requirements. I then need to INSERT the workitems into the WorkItem
table and use the identity values from the WorkItem
table to create the cross-reference rows in the RequirementWorkItem
table.
Is there a way to do this without cursoring thru each row? And I can't put the RequirementId
into the WorkItem
table because depending on the WorkItemTypeId
the WorkItem
could be linked to a Requirement
or a Notice
or an Event
.
So there are really 3 xref tables for WorkItems
. Or would it be better to put a RequirementId
, NoticeId
and EventId
in the WorkItem
table and 1 of the columns would have a value and other 2 would be null? Hopefully all this makes sense. Thanks.
You should read MERGE and OUTPUT – the swiss army knife of T-SQL for more information about this.
Today I stumbled upon a different use for it, returning values using an OUTPUT clause from a table used as the source of data for an insertion. In other words, if I’m inserting from [tableA] into [tableB] then I may want some values from [tableA] after the fact, particularly if [tableB] has an identity. Observe my first attempt using a straight insertion where I am trying to get a field from @source.[id] that is not used in the insertion:
精彩评论