函数在返回所有结果之前结束

问题描述

| 我正在使用此功能,该功能使我可以查询MS sql 2005中大型XML表中保存的列表值。
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>
函数对我来说仍然是个谜,但似乎我的函数正在第一个值停止,而没有遍历其他值。我如何获得退回所有物品的信息? 感谢您的光临。     

解决方法

        您通常会像这样在SQL Server中使用XPath解析XML
DECLARE @xml 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>\'

SELECT
   x.item.value(\'label[1]\',\'varchar(100)\'),x.item.value(\'value[1]\',\'int\')
FROM
   @xml.nodes(\'/Name/items/item\') x(item)
在这种情况下,我会尝试类似的方法,假设您从
KB_XMod_ExtractFieldValue
获取xml
DECLARE @xml xml;

SELECT @xml = dbo.KB_XMod_ExtractFieldValue(InstanceData,\'Name\')
FROM KB_XMod_Modules 
WHERE FormID=18;

SELECT
   x.item.value(\'label[1]\',\'int\')
FROM
   @xml.nodes(\'/Name/items/item\') x(item);
但是,您有更大的问题:您正在尝试使用截断xml数据的标量函数来获取类似表的数据 如果要返回表,则需要使用RETURNS TABLE。请参阅创建功能 您将@Return作为nvarchar(255)会截断 注意:这是一个函数,而不是存储过程,它启动ѭ7