TSQL хранимая процедура и XQuery? - PullRequest
       14

TSQL хранимая процедура и XQuery?

0 голосов
/ 23 сентября 2010

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

Я уже застрял во входных параметрах, рассмотрим следующий 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 search "A1, B-1,C "является входной строкой и будет иметь значение true, которое затем необходимо поместить в таблицу.Но «A, B, C» будет ложным.

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

РЕДАКТИРОВАТЬ: код ниже, я думаю, идет в правильном направлении, но у меня есть еще одна большая проблема.Мне нужно проанализировать каждое значение шаблона с соответствующей таблицей.

Я лучше приведу пример: входное значение "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 в процедуре будет работать лучше.

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

1 Ответ

0 голосов
/ 23 сентября 2010

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

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> в этом случае.

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

...