TSQL存储过程和XQuery?

时间:2010-09-23 16:08:57

标签: sql xml tsql xquery

在输入要查找的特定字符串模式后,我想编写一个查询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>

我想要实现的是找到并输出将element-tag和option-tag组合到表中的特定模式。

例如:EXEC搜索“A1,B-1,C”是输入字符串,它将为true,然后需要将其放入表中。但“A,B,C”将是错误的。

我对TSQL不太好,所以我不知道如何分割或排列搜索模式,以便我可以使用它来处理element-tag和option-tag并将它们放入变量或如此。

编辑:我认为下面的代码正朝着正确的方向发展,但我还有另外一个大问题。 我需要用相应的表来分析模式的每个值。

我最好举一个例子:输入是“A1,B-1,C”btw输入长度应该是灵活的。

在我现有的表中,我有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 :(得分: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>

这个解决方案非常讨厌,不足以暗示这种方法不太合适。