覆盖SQL Server Maxrecursion?

时间:2013-04-09 17:56:48

标签: sql sql-server tsql recursion

我有一个像

这样的结构的表
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个值的列拆分为两个,然后进行递归?

1 个答案:

答案 0 :(得分:1)

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

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

是的,当然。表中的每个字符串都有一个固定的分隔符char。我们将separator char替换为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>