簡體   English   中英

如何使用SQL Cross Apply和MERGE

[英]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 MatchedWhen 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM