我有一个临时表,其中包含帐户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数据做那些。
有谁知道如何处理这个问题?任何帮助将非常感激。
答案 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 predicate
在XQuery
中设置过滤器。