本文介紹了使用FLWOR從另一個表中獲取數據的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我在SQL Server 2012中有一個表,其結構如下:
CREATE TABLE [dbo].[tblStepList]
(
[ToDoId] [int] IDENTITY(1,1) NOT NULL,
[Data] [xml] NOT NULL
)
Data
列的類型為XML
,內容如下:
<Steplist>
<Step>
<StepId>e36a3450-1c8f-44da-b4d0-58e5bfe2a987</StepId>
<Rank>1</Rank>
<IsComplete>false</IsComplete>
<TextReadingName>bug-8588_Updated3</TextReadingName>
</Step>
<Step>
<StepId>4078c1b1-71ea-4578-ba61-d2f6a5126ba1</StepId>
<Rank>2</Rank>
<TextReadingName>reading1</TextReadingName>
</Step>
</Steplist>'
我想用新的XML更新表的每一行,以便在TextReadingID之后查找名為TextReadingID的新節點
我有一個二級表,其中包含文本讀取值steid和textreadingid
StepId TextReadingId
---------------------------------------------------
e36a3450-1c8f-44da-b4d0-58e5bfe2a987 118
4078c1b1-71ea-4578-ba61-d2f6a5126ba1 119
d466a8ee-9214-4b9c-94f9-2117f5dffe93 401
并且我希望我的TextReadingId值來自上表
<Steplist>
<Step>
<StepId>e36a3450-1c8f-44da-b4d0-58e5bfe2a987</StepId>
<Rank>1</Rank>
<IsComplete>false</IsComplete>
<TextReadingName>bug-8588_Updated3</TextReadingName>
<TextReadingId>118</TextReadingId>
</Step>
<Step>
<StepId>4078c1b1-71ea-4578-ba61-d2f6a5126ba1</StepId>
<Rank>2</Rank>
<TextReadingName>reading1</TextReadingName>
<TextReadingId>401</TextReadingId>
</Step>
</Steplist>';
這就是我嘗試的,但它沒有按預期工作
DECLARE @i int;
SELECT
@i = s.data.value('count(/Steplist/Step)', 'nvarchar(max)')
FROM
tblStepList s
SET data.modify('insert <TextReadingId>{sql:variable("@i")}</TextReadingId> as last into (/Steplist/Step[sql:variable("@i")])[1]')
PRINT @i
Here is another answer that helped but it does not join with my other table for the results
推薦答案
最簡單的方法是重建每個Step
節點,然后使用FOR XML
將其聚合起來
在相關子查詢中,我們執行以下操作:
使用.nodes()
拆分Step
節點
在StepId
節點值上的左聯接StepReading
創建包含新Step
節點的未命名列…
.它包含使用./*
…的現有對象的所有子對象
.和一個額外的子節點TextReadingId
,其值來自StepReading
然后使用FOR XML
聚合備份
UPDATE sl
SET Data = (
SELECT v.Step.query('
<Step>{./*,
if (not(./TextReadingId)) then
<TextReadingId>{sql:column("sr.TextReadingId")}</TextReadingId>
else ()
}
</Step>
')
FROM sl.Data.nodes('/Steplist/Step') v(Step)
LEFT JOIN StepReading sr ON sr.StepId = v.Step.value('(StepId/text())[1]','uniqueidentifier')
FOR XML PATH(''), ROOT('Steplist'), TYPE
)
FROM tblStepList sl;
SQL Fiddle
這篇關于使用FLWOR從另一個表中獲取數據的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,