SQL游标将列表项打包到变量中。。。但需要更多

SQL游标将列表项打包到变量中。。。但需要更多,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,在我的存储过程中,我通过调用一个使用CURSOR/FETCH的自定义函数,用一组自己的列表项填充变量[MyVariable] SQL: SELECT dbo.udf_GrabStuff(@ID) AS MyListItems <ul id="comments"> *** All of the li elements are from the fetch *** <li> <div>This is an item</div

在我的存储过程中,我通过调用一个使用CURSOR/FETCH的自定义函数,用一组自己的列表项填充变量[MyVariable]

SQL: SELECT dbo.udf_GrabStuff(@ID) AS MyListItems

<ul id="comments">
    *** All of the li elements are from the fetch ***
    <li>
        <div>This is an item</div>
    </li>
    <li>
        <div>This is another item</div>
    </li>
</ul>
返回多个列表的最佳方法是什么,但所有列表都打包在同一个[MyVariable]中,这样我就可以返回这个列表了

<ul id="comments">
    *** All of the li elements are from the fetch ***
    <li>
        <div>This is an item</div>
        *** This item had children
        <ul id="something">
            <li>Child item</li>
            <li>Child item</li>
        </ul>
    </li>
    <li>
        <div>This is another item</div>
    </li>
</ul>
谢谢你的帮助

//////////继续解释

我有一个存储过程,它从Product表查询产品列表。这些产品的注释存储在注释表中。在我的存储过程中,我选择了所有关于产品的信息,然后我需要将ul、li等的完整html代码传递到一个[Comment]变量中。我已经成功地用cursor/fetch实现了这一点,但我读得越多,就听说这是个坏主意

我想做的是将其提升到下一个层次,在父注释中包含子注释,因此我最初的想法是从第一个游标函数中调用另一个游标函数,根据需要加载每个父注释,但听起来有更好的方法

让我们假设我的最终结果是:

<ul id="parentcomments">
  <li id="parent1">
    <div>This is a parent comment</div>
    <ul id="childrenforparent1">
      <li id="child1">
        <div>This is a child comment</div>
      </li>
    </ul>
  </li>
  <li id="parent2">
  ... and so on
</ul>      

但同样,我需要将这个多合一的[Comments]变量传递回我的主存储过程。我可以用AJAX轻松地做孩子们的评论,但我更愿意在运行时从服务器上呈现它们。

经过一个痛苦的学习过程,我找到了我的解决方案,没有睡觉!响应时间也非常快

CREATE FUNCTION [dbo].[udf_GetParentComments]
(
  @ProductID INT
)
RETURNS VARCHAR(MAX)
AS 
BEGIN

DECLARE @Comments VARCHAR(MAX)

SELECT @Comments = STUFF((SELECT ' ' + 
    '<li id="Comment_' + CAST(CommentID AS VARCHAR) + '"' + '>' + 
        CAST(Comment_Comment AS VARCHAR(MAX)) + 
        '<ul>' + CAST(dbo.udf_GetCommentReplies(CommentID) AS VARCHAR(MAX)) + '</ul>' + 
    '</li>' 

    FROM Product_Comment


    FOR XML PATH('')), 1, 1, '')

SELECT @Comments = REPLACE(REPLACE(@Comments, '&lt;', '<'), '&gt;', '>'); 



RETURN @Comments

END



GO
在第一个函数中调用的第二个函数与此函数相同,但会返回回复。我不得不使用REPLACE来支持HTML格式,否则XML安全会将其删除


有人有比这更好的解决方案吗?到目前为止,这使我能够在单个SQL变量中打包父级和子级的分层列表

究竟为什么在这里使用光标?你应该努力消除光标!我几乎100%确信,在等待回复时,没有一个蹩脚的、破坏性能的光标,我可以做到这一点……我偶然发现了多篇文章来加强你的评论。我很乐意用一种更好的方法。我只是不知道该往哪个方向走。在存储过程中,我将返回数据列表。在该数据列表中,其中一个变量用于注释。我需要这些评论也包括儿童评论,如果他们存在。我需要将所有这些都打包到一个最终变量中,因此在函数中生成HTML是必要的,有些注释没有回复,而其他注释没有回复。@marc_s我扩展了我的解释。。。不确定这是否有用。希望如此。我想用任何最好的方法来达到这个目的。感谢您的回复。如果不深入了解您的数据模型,很难在此提供答案。也许你可以在一个简单的数据库中建立你的数据模型?创建表并填充几行数据?第一次使用SQL FIDLE:所以在上面示例的最后一部分中,我需要如何将数据返回到变量。我需要将HTML生成到一个变量中,这样才能足够聪明地为注释回复添加额外的内联UL(如果存在的话)。