如何解决函数在返回所有结果之前结束
| 我正在使用此功能,该功能使我可以查询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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。