SQL返回子查询'总记录'外部查询

时间:2016-01-18 20:41:53

标签: sql xml sql-server-2008 subquery

这个让我有点难过,我试图从这个SQL查询中获取我的顶级(根)节点XML中的总计数:

    SELECT COUNT(*) OVER() as '@totalCount', (
        SELECT COUNT(*) OVER() as totalCount, [Title], [Year], [Type], [Poster]
        FROM movies As result where CONTAINS(Title, @Title) Order by [Weight] DESC
        OFFSET ((@PageNumber - 1) * @RowspPage) ROWS
        FETCH NEXT @RowspPage ROWS ONLY
        FOR XML AUTO, type
    ) 
    FOR XML PATH('root')

显然,COUNT(*) OVER()仅返回" 1"因为它是在顶层而不是在子查询中执行的。但我只希望在根节点中显示一次,而不是每个结果重复一次。

result of code

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

编辑:这是一个包含常用数据的工作示例:

;with myCTE as
(
    select *
    from sys.objects
)
select (select count(*) from myCTE) as [@Counter]
    ,(
       SELECT myCTE.object_id AS id
             ,mycte.name AS name 
       from myCTE
       for xml path('object'),TYPE
      )       
for xml path('test')

您可能会尝试将查询转换为CTE并将其置于以下内容中:

;WITH MyQueryAsCTE AS
(
    SELECT [Title], [Year], [Type], [Poster]
    FROM movies As result where CONTAINS(Title, @Title) Order by [Weight] DESC
    OFFSET ((@PageNumber - 1) * @RowspPage) ROWS
    FETCH NEXT @RowspPage ROWS ONLY
)
SELECT  (SELECT Count(*) FROM MyQueryAsCTE) as '@totalFound'
       ,[Title] AS [Movie/Title] 
       ,[Year] AS [Movie/Year]
       ,[Type] AS [Movie/Type]
       ,[Poster] AS [Movie/Poster]
FROM MyQueryAsCTE
FOR XML PATH('root')

答案 1 :(得分:0)

有趣的字符串...这是一个彻底的黑客,但它的工作原理:

DECLARE @totalCount AS INT
DECLARE @result varchar(MAX)

SELECT @totalCount = COUNT(*) OVER(), @result = COALESCE(@result + '', '') + '<result title="' + [Title] + '" year="' + [Year] + '" type="' + [Type] + '"/>'
FROM Movies where CONTAINS(Title, '@Title') Order by [Weight] DESC
OFFSET ((@PageNumber - 1) * @RowspPage) ROWS
FETCH NEXT @RowspPage ROWS ONLY
SELECT '<root totalCount="' + CAST(@totalCount AS VARCHAR) + '">' + @result + '</root>'

输出:

enter image description here

似乎有更快/更高效的执行计划,因为计算只进行一次,并且不需要对任何表进行额外查询。