【问题标题】:TSQL statement to iterate over XML nodes in field用于遍历字段中的 XML 节点的 TSQL 语句
【发布时间】:2015-02-28 06:56:58
【问题描述】:

我有 2 个字段,其中包含这样的随机值列表,其中列表用空格分隔

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

字段中的值和计数是随机的(A 并不总是在字段 2 的索引 1 中,所以它可以是

field1,field2
2 8,B A

唯一一致的是 A B 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 循环,但没有运气

对此表示赞赏的任何帮助

【问题讨论】:

  • 寻找这个:DECLARE @A INT = (SELECT CASE WHEN 1=2 THEN 3 ELSE 4 END);

标签: sql-server xml tsql iterator


【解决方案1】:

也许您不需要 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')

【讨论】:

  • 感谢您的帮助,您的代码让我非常接近我需要的内容,我仍在尝试理解 count(../*[.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 2011-08-19
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多