Я использую эту функцию, которая позволяет запрашивать значения списка, хранящиеся в большой таблице XML в MS SQL 2005.
CREATE FUNCTION dbo.KB_XMod_ExtractListFieldValue
(
@InstanceData ntext,
@FieldName nvarchar(80)
)
RETURNS nvarchar(255)
AS
BEGIN
DECLARE @Return nvarchar(255)
DECLARE @Start int
DECLARE @End int
DECLARE @FieldValueLength int
DECLARE @FieldNameLength int
SELECT @Return=dbo.KB_XMod_ExtractFieldValue(@InstanceData,@FieldName)
SELECT @Start = CHARINDEX('<value>', @Return)
SELECT @FieldNameLength = LEN('<value>')
SELECT @End = CHARINDEX('</value>', @Return)
SELECT @FieldValueLength = (@End - (@Start + @FieldNameLength))
IF @FieldValueLength > 0
SELECT @Return = SUBSTRING(@Return, @Start + @FieldNameLength, @FieldValueLength)
ELSE
SELECT @Return = ''
RETURN @Return
END
Это позволяет мне создать запрос, такой как:
SELECT dbo.KB_XMod_ExtractFieldValue(InstanceData,'Name')
FROM KB_XMod_Modules
WHERE FormID=18
Проблема в том, что функция возвращает только первый набор в любой записи.Поэтому, если XML-запись выглядит следующим образом ...
<Name>
<items>
<item>
<label>Jimmy</label>
<value>960</value>
</item>
<item>
<label>John</label>
<value>938</value>
</item>
<item>
<label>Robert</label>
<value>989</value>
</item>
</items>
</Name>
, я получаю только первый элемент, то есть <label>Jimmy</label><value>960</value>
.Функции до сих пор для меня загадка, но кажется, что моя останавливается на первом значении, а не перебирает остальные.Как я могу заставить его вернуть все предметы?
Спасибо за внимание.