2010-09-23 5 views
0

Я хочу написать хранимую процедуру, которая запрашивает файлы XML после ввода определенного шаблона строки для поиска.TSQL хранимая процедура и XQuery?

Я уже застрял на входных параметрах, рассмотрю следующий XML-документ.

<root> 
    <container> 
     <element>A</element> 
     <option>1</option> 
    </container> 
    <container> 
     <element>B</element> 
     <option>-1</option> 
    </container> 
    <container> 
     <element>C</element> 
    </container> 
</root> 

То, что я хочу достичь, это найти и вывести определенный шаблон, объединяющий элемент-тег и метку-опцию в таблицу.

Например: EXEC-поиск «A1, B-1, C» - это строка ввода и будет истинна, которая затем должна быть помещена в таблицу. Но «A, B, C» будет ложным.

Я не очень хорошо разбираюсь в TSQL, поэтому не знаю, как я мог бы разделить или упорядочить шаблон поиска, чтобы я мог использовать его для работы с тегом-тегом и tag-тегом и поместить их в переменные или так.

EDIT: Код ниже, я думаю, идет в правильном направлении, но у меня есть еще одна большая проблема. Мне нужно проанализировать каждое значение шаблона с соответствующей таблицей.

Я лучше приведу пример: Входная длина входного сигнала «A1, B-1, C» должна быть гибкой.

В моей существующей таблице у меня есть 4 колонки со следующими данными:

ID| Value | Meaning | Info 
    1 | A | text | text 
    2 | A-1 | text | text 
    3 | A1 | text | text 
    4 | B | text | text 
    5 | B-1 | text | text 

и так далее ...

Теперь-то мне нужно, чтобы проверить каждый отдельный вход-строку со значением и выходом строка ввода с колонками «Значение» и «Информация» в другую таблицу.

В приведенном выше примере мне нужно будет найти последовательность «A1, B-1, C», а затем вывести соответствующий текст (включая строку) таблицы выше в новую таблицу. Так что это может выглядеть следующим образом:

| Value | Meaning | Info 
    | A1 | text | text 
    | B-1 | text | text 
    | C | text | text 

Я не знаю, если я делаю это слишком сложно с приведенной выше таблице, или если CASE/IF-ELSE структуры в процедуре будет работать лучше.

Кто-нибудь знает, как это можно достичь?

+0

Это было бы ** много ** проще, если бы ваши теги и

ответ

0

Это выглядит так, как будто вы используете неправильные инструменты для работы, но если это довольно жестких ограничений вы работаете против, то вы могли бы использовать, например, следующее:

drop table #xml 
drop table #queryparams 

declare @x xml 
select @x = '<code><root><items><element>A</element><option>1</option></items><items><element>B</element><option>-1</option></items><items><element>C</element></items></root></code>' 

create table #xml (element varchar(60), [option] int null) 

insert into #xml 
select code.item.value('(element)[1]', 'varchar(60)'), 
    code.item.value('(option)[1]', 'int') 
from 
    @x.nodes('/code/root/items') AS code(item) 

declare @queryParam varchar(60) 
select @queryParam = 'A1,B-1,C' 

create table #queryparams (element varchar(60), [option] int null) 

insert into #queryparams 
select left(data,1), RIGHT(data, len(data)-1) 
from dbo.split(@queryParam,',') 

if not exists (
select * 
from #xml x 
left join #queryparams q 
    on x.element = q.element 
where q.[option] is null 
) 
select 1 
else 
select 0 

Как marc_s предлагает вам лучше с <element> и <option> тегами внутри общего тега. В этом случае я выбрал плохо названное <items>.

Это решение достаточно противно предположить, что подход не совсем прав.

+0

На самом деле вы правы, и структура моего xml-файла также похожа на то, что вы мне рекомендовали, я просто пропустил его, поэтому я отредактирую это быстро. – SvenB