簡體   English   中英

用於在字段中迭代XML節點的TSQL語句

[英]TSQL statement to iterate over XML nodes in field

我有2個字段,其中包含隨機值列表,其中列表以空格分隔

field1,field2
2 4 8 4,A B C B

字段中的值和計數是隨機的(A不總是在字段2的索引1中,因此它可以是

field1,field2
2 8,B A

唯一一致的是AB C.我需要的是總結值並創建列到目前為止我有這個

SELECT
CAST (N'<H><r>' + REPLACE([field1], ' ', '</r><r>')  + '</r></H>' AS XML) AS [vals],
CAST (N'<H><r>' + REPLACE([field], ' ', '</r><r>')  + '</r></H>' AS XML) AS [cols]
FROM tt

由於某種原因,我不能使用這樣的變量

DECLARE @A
    Select 
    CASE WHEN 
    [cols].value('count(/H/r)[1]','VARCHAR(100)') = 'A' THEN @A = @A + [vals].value('count(/H/r)[1]','VARCHAR(100)') END
    from .....

我迷路了我甚至無法為變量分配值並在TSQL中返回數據我在SELECT語句中嘗試了WHILE循環而沒有運氣

這個有用的任何幫助

也許你不需要while循環?

WITH cte AS (
  SELECT
    --Generate an identifier for each row (if none exists)
    row_id = ROW_NUMBER() OVER(ORDER BY (SELECT 1))
   ,vals   = CAST (N'<val>' + REPLACE([field1], ' ', '</val><val>')  + '</val>' AS XML)
   ,cols   = CAST (N'<col>' + REPLACE([field2], ' ', '</col><col>')  + '</col>' AS XML)
  FROM tt
)
SELECT
  row_id
 ,col_id   = col.value('.','varchar(max)') 
 ,value    = val.value('.','varchar(max)') 
FROM cte
CROSS APPLY vals.nodes('val') v(val)
OUTER APPLY cols.nodes('col') c(col)
WHERE 
  --Get the node position by counting the preceding siblings. Only return rows where val position equals col position.
  val.value('for $i in . return count(../*[. << $i]) + 1', 'int') = col.value('for $i in . return count(../*[. << $i]) + 1', 'int')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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