Завершение функции до того, как будут возвращены все результаты - PullRequest
0 голосов
/ 29 мая 2011

Я использую эту функцию, которая позволяет запрашивать значения списка, хранящиеся в большой таблице 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>.Функции до сих пор для меня загадка, но кажется, что моя останавливается на первом значении, а не перебирает остальные.Как я могу заставить его вернуть все предметы?

Спасибо за внимание.

1 Ответ

0 голосов
/ 29 мая 2011

Обычно вы анализируете XML с XPath внутри SQL Server, как показано ниже*

Однако у вас есть большие проблемы: вы пытаетесь вернуть данные в виде таблиц, используя скалярную функцию, которая обрезает данные XML

  • , если вы хотите вернуть таблицу, вам нужно использоватьВОЗВРАЩАЕТСЯ СТОЛ.См. CREATE FUNCTION
  • у вас есть @Return as nvarchar (255), который все равно будет усекаться

Примечание: это функция, а не хранимая процедура, которая запускается CREATE PROCEDURE

...