SQL CURSOR将列表项打包到变量中......但需要更多

时间:2014-01-30 03:10:00

标签: 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>
    </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]变量中。我用光标/ 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]变量中,并传回给我的主SPROC。我可以通过AJAX轻松地做孩子评论,但宁愿在服务器运行时渲染它们。

1 个答案:

答案 0 :(得分:1)

在经历了痛苦的学习过程而没有睡眠之后,我想出了我的解决方案!响应时间也非常快。

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变量中打包父级和子级的分层列表。