0

我有一个结构像的表

name    properties
x       thing1, thing2, thing3
y       otherthing1, otherthing2, otherthing3

我想将其映射到一对多的关系,例如

name  properties
x     thing1
x     thing2
x     thing3

我有以下解决方案,但遇到了 SQL Server 中的 Maxrecursion 选项

;with tmp(brandName, drugList, genericName) as (
select brandName, LEFT(genericName, CHARINDEX(',',genericName+',')-1),
    STUFF(genericName, 1, CHARINDEX(',',genericName+','), '')
from eeeee
where LEN(genericName) - LEN(replace(genericName,',','')) < 100
union all
select brandName, LEFT(genericName, CHARINDEX(',',genericName+',')-1),
    STUFF(genericName, 1, CHARINDEX(',',genericName+','), '')
from tmp
where genericName > ''
)
select brandName,  drugList
from tmp
order by brandName

where 子句是让我们运行这个查询的原因,因为多值列中有一些行在列表中有超过 100 个项目。有什么方法可以偷偷摸摸并覆盖 SQL Server 的 100 最大递归限制?还是最好继续将具有超过 100 个值的列分成两部分,然后进行递归?

4

1 回答 1

0

我可以在不使用递归的情况下提出更有效的解决方案 -

DECLARE @temp TABLE
(
      name NVARCHAR(50)
    , properties NVARCHAR(1000)
)

INSERT INTO @temp (name, properties)
VALUES 
    ('x', 'thing1, thing2, thing3'),
    ('y', 'otherthing1, otherthing2, otherthing3')

SELECT  
      data.name
    , property = LTRIM(data.property)
FROM (
    SELECT 
          name = p.value('(./n)[1]', 'NVARCHAR(50)')
        , property = p.value('(./s)[1]', 'NVARCHAR(1000)')
    FROM (
        SELECT field = CAST('<r><s>' + REPLACE(t.properties + ',', ',', '</s><n>' + t.name + '</n></r><r><s>') + '</s></r>' AS XML) 
        FROM @temp t
    ) d
    CROSS APPLY field.nodes('/r') t(p)
) data
WHERE data.name IS NOT NULL

是的当然。表中的每个字符串都有一个固定的分隔符。我们将分隔符字符替换为 XML 结构的一部分。我们得到这样的行:

thing1, thing2, thing3 -> <r><s>thing1</s><s>thing2</s><s>thing3</s></r>

将字符串转换为 XML 日期类型并解析形成的树:

<r>
 <s>thing1</s>
 <n>x</n>
</r>
<r>
 <s> thing2</s>
 <n>x</n>
</r>
<r>
 <s> thing3</s>
 <n>x</n>
</r>
于 2013-04-10T09:43:51.513 回答