使用SQL从XML列中获取数据

时间:2018-02-07 23:04:53

标签: sql-server xml tsql xpath xquery

我有一个临时表,其中包含帐户ID和客户ID以及xml字段

#tempXML(uniqueidentifier AccountId, uniqueidentifier CustomerId, xml xmlData)

XML字段与此类似,其中FieldId是一个uniqueidentifier,它告诉我在FieldValue字段中存储了哪些数据。我能够使用以下SQL获取一些数据。我不得不多次写入它,每次在括号中增加1的值,以查看每个字段,但如果没有为支持FieldIds设置FieldValue,则会导致问题。

SELECT  #tempXML.customFieldData.value('(CustomFields/Field/FieldValue)[7]', 
    'varchar(10)') AS dataField
FROM #tempXML 
WHERE #tempXML.customFieldData.value('(CustomFields/Field/FieldId)[7]', 
    'varchar(36)') = '22222222-2222-2222-2222-222222222222'

这是其中一个XMl字段的示例。数据可以是任何顺序,并非所有FieldId都被使用或者与FieldValues相关联。

<CustomFields>
  <Field>
    <FieldId>aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa</FieldId>
  </Field>
  <Field>
    <FieldId>bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbb9c</FieldId>
    <FieldValue />
 </Field>
 <Field>
    <FieldId>cccccccc-cccc-cccc-cccc-cccccccccccc</FieldId>
    <FieldValue />
 </Field>
 <Field>
    <FieldId>dddddddd-dddd-dddd-dddd-dddddddddddd</FieldId>
 </Field>
 <Field>
   <FieldId>eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee</FieldId>
 </Field>
 <Field>
   <FieldId>11111111-1111-1111-1111-111111111111</FieldId>
   <FieldValue>more data</FieldValue>
 </Field>
 <Field>
   <FieldId>22222222-2222-2222-2222-222222222222</FieldId>
   <FieldValue>What I want</FieldValue>
 </Field>
 <Field>
   <FieldId>33333333-3333-3333-3333-333333333333</FieldId>
   <FieldValue>Some Data</FieldValue>
 </Field>
</CustomFields>

我遇到的问题是我只能使用当前代码查看XMl记录中的第n个字段,如果该FieldId存在但没有FieldValue,则会抓取下一个当前的FieldValue。

我能够找到的所有示例都使用FieldId的唯一名称,这使得他们可以轻松地跳转到它们并知道这些字段中的数据时间。我不能用给定的XML数据做那些。

有谁知道如何处理这个问题?任何帮助将非常感激。

1 个答案:

答案 0 :(得分:0)

试试这样:

DECLARE @mockupTable TABLE(YourXML XML);
INSERT INTO @mockupTable VALUES
(N'<CustomFields>
 <Field>
   <FieldId>11111111-1111-1111-1111-111111111111</FieldId>
   <FieldValue>more data</FieldValue>
 </Field>
 <Field>
   <FieldId>22222222-2222-2222-2222-222222222222</FieldId>
   <FieldValue>What I want</FieldValue>
 </Field>
 <Field>
   <FieldId>33333333-3333-3333-3333-333333333333</FieldId>
   <FieldValue>Some Data</FieldValue>
 </Field>
</CustomFields>');

- 这是您要搜索的字段ID

DECLARE @SearchFor UNIQUEIDENTIFIER='22222222-2222-2222-2222-222222222222';

- 这是实际的查询

SELECT t.YourXML.value(N'(/CustomFields/Field[FieldId=sql:variable("@SearchFor")]/FieldValue)[1]',N'nvarchar(max)')
FROM @mockupTable AS t;

您可以使用sql:variable()传递变量值,然后使用XQuery predicateXQuery中设置过滤器。