SQL Return 子查询 'Total Records' 到外部查询
SQL Return subquery 'Total Records' to outer query
这个让我有点难过,我试图从这个 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”,因为它是在顶层执行的,而不是在子查询中。但我只想在根节点中显示一次,而不是对每个结果重复。
如有任何帮助,我们将不胜感激。
编辑:这里是一个包含通用数据的工作示例:
;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')
有趣的字符串...这是一个完全的 hack,但它有效:
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>'
输出:
似乎有一个 faster/more 高效的执行计划,因为只进行一次计算,不需要对任何表进行额外查询。
这个让我有点难过,我试图从这个 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”,因为它是在顶层执行的,而不是在子查询中。但我只想在根节点中显示一次,而不是对每个结果重复。
如有任何帮助,我们将不胜感激。
编辑:这里是一个包含通用数据的工作示例:
;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')
有趣的字符串...这是一个完全的 hack,但它有效:
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>'
输出:
似乎有一个 faster/more 高效的执行计划,因为只进行一次计算,不需要对任何表进行额外查询。