[英]How to use a SQL Cross Apply and a MERGE
有沒有辦法使用帶有MERGE
語句的Cross Apply
? 我是Cross Apply
新手,仍然試圖解決所有這些問題。 這是我在包含XML節點的單元格上執行的INSERT和UPDATE的模擬演示:
UPDATE NewTable
SET
NewTable.ID = ID,
NewTable.Title = Parent.Elm.value('(Title)[1]', 'varchar(100)'),
NewTable.[Description] = Parent.Elm.value('(Description)[1]', 'varchar(100)'),
NewTable.ChildTitle = Child.Elm.value('(ChildTitle)[1]', 'varchar(100)'),
NewTable.StartDate = Child.Elm.value('(StartDate)[1]', 'DATETIME'),
NewTable.EndDate = Child.Elm.value('(EndDate)[1]', 'DATETIME')
FROM OldTable
cross apply
xmlFieldData.nodes('/ParentElement') xp(parent)
cross apply
xp.parent.nodes('ChildElement') xc(child)
WHERE OldTable.ID = NewTable.ID
INSERT INTO NewTable(ID, Title, [Description], ChildTitle, StartDate, EndDate )
SELECT
Parent.Elm.value('(Title)[1]', 'varchar(100)') AS 'Title',
Parent.Elm.value('(Description)[1]', 'varchar(100)') AS 'Description',
Child.Elm.value('(ChildTitle)[1]', 'varchar(100)') AS 'ChildTitle',
Child.Elm.value('(StartDate)[1]', 'DATETIME') AS 'StartDate',
Child.Elm.value('(EndDate)[1]', 'DATETIME') AS 'EndDate'
FROM OldTable
cross apply
xmlFieldData.nodes('/ParentElement') Parent(Elm)
cross apply
Parent.Elm.nodes('ChildElement') Child(Elm)
這是我的XML文件中的內容:
<ParentElement>
<Title>parent1</Title>
<Description />
<ChildElement>
<Title>Child 4</Title>
<Description />
<StartDate>2010-01-25T00:00:00</StartDate>
<EndDate>2010-01-25T00:00:00</EndDate>
</ChildElement>
<ChildElement>
<Title>Child1</Title>
<Description />
<StartDate>2010-01-25T00:00:00</StartDate>
<EndDate>2010-01-25T00:00:00</EndDate>
</ChildElement>
<ChildElement>
<Title>Child6</Title>
<Description />
<StartDate>2010-01-25T00:00:00</StartDate>
<EndDate>2010-01-25T00:00:00</EndDate>
</ChildElement>
</ParentElement>
如果我被困在MERGE語句中,那么將交叉應用放在'USING'部分:
MERGE INTO NewTable AS NewTable
USING OldTable
cross apply
xmlFieldData.nodes('/ParentElement') xp(parent)
cross apply
xp.parent.nodes('ChildElement') xc(child)
WHERE OldTable.ID = NewTable.ID AND Child.Elm.value('(ChildTitle)[1]', (100)') = ChildTitle
謝謝你的幫助!
嘗試包裹OldTable
作為Select
在發言Using
。 例如:
Merge Into NewTable As Target
Using
(
Select Fields
From OldTable
Cross Apply xmlFieldData.nodes('/ParentElement') xp(parent)
Cross Apply xp.parent.nodes('ChildElement') xc(child)
Where Child.Elm.value('(ChildTitle)[1]', (100)) = ChildTitle
) As Source On Source.ID = Target.ID
XML對我來說似乎很奇怪,但我真的不太了解SQL中的XML。 但是,這應該指向正確的方向。
您需要添加到Merge
語句中的所有內容都是您When Matched
或When Not Matched
。
使用原始查詢中的字段,它將如下所示:
Merge Into NewTable As Target
Using
(
Select ID,
Parent.Elm.value('(Title)[1]', 'varchar(100)') [Title],
Parent.Elm.value('(Description)[1]', 'varchar(100)') [Description],
Child.Elm.value('(ChildTitle)[1]', 'varchar(100)') [ChildTitle],
Child.Elm.value('(StartDate)[1]', 'DATETIME') [StartDate],
Child.Elm.value('(EndDate)[1]', 'DATETIME') [EndDate]
From OldTable
Cross Apply xmlFieldData.nodes('/ParentElement') xp(parent)
Cross Apply xp.parent.nodes('ChildElement') xc(child)
) As Source On Source.ID = Target.ID And Source.ChildTitle = Target.ChildTitle
When Matched Then
Update
Set Title = Source.Title,
Description = Source.Description,
StartDate = Source.StartDate,
EndDate = Source.EndDate
When Not Matched Then
Insert (ID, Title, Description, ChildTitle, StartDate, EndDate)
Values (Source.ID, Source.Title, Source.Description, Source.ChildTitle, Source.StartDate, Source.EndDate)
;
您確定交叉申請的語法是否正確? 我認為應該寫成:
CROSS APPLY (SELECT FieldName = xmlFieldData.nodes('/ParentElement') xp(parent)) p
我從來沒有像以前那樣使用過合並或XML的交叉應用,但我想知道這是否能修復它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.