2013-04-09 4 views
0

У меня есть таблица со структурой, какПереопределить максимальную скорость SQL Server?

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

, и я хотел бы сопоставить этот один-ко-многим, как

name properties 
x  thing1 
x  thing2 
x  thing3 

В этом следующее решение у меня работает, но работает против опция Maxrecursion в SQL Server

;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 

где положение является то, что пусть это за прогон запроса, потому что есть некоторые строки в многозначной колонке т шляпа имеет более 100 предметов в списке. Есть ли способ скрыться и переопределить максимальный предел SQL Server при рекурсии? Или будет лучше всего пойти дальше и разделить столбцы с более чем 100 значениями на два, а затем сделать рекурсию?

+3

использования а [запрос подсказка] (http://msdn.microsoft.com/en-gb /library/ms181714.aspx) в конце, например 'OPTION (MAXRECURSION 0)' –

+0

Я пробовал вариант (maxrecursion 100), очевидно, я не понимал, как это реализовать. +1 – wootscootinboogie

+0

'(MAXRECURSION 100)' является значением по умолчанию. '(MAXRECURSION 0)' переопределяет максимальную рекурсию без ограничений. В MSDN: 'Определяет максимальное количество рекурсий, разрешенных для этого запроса. число представляет собой неотрицательное целое число от 0 до 32767. Если указано 0, предел не применяется. Если этот параметр не указан, предел по умолчанию для сервера равен 100.' –

ответ

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. Мы заменяем 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> 
+0

Это довольно интересно. помогите объяснить, как это работает? я не видел ничего подобного до – wootscootinboogie

+0

Теперь вернемся к этому ответу, где вы объяснили, как это работает. Благодаря! – wootscootinboogie

+0

Добро пожаловать @wootscootinboogie. – Devart

Смежные вопросы