我想使用类似于此处提到的linq返回动态sql查询的rowcount:
我正在使用动态sql创建where子句并在结果集上实现分页,我想要返回的rowcount是满足where条件的记录总数。
我的SQL导致了我的问题:
-- get row count
SET @SQL = '@TotalRowCount = SELECT COUNT(*) as TotalRowCount'
SET @SQL = @SQL + @WHERE
IF (LEN(@SUBWHERE) > 0)
BEGIN
SET @SQL = @SQL + @SUBWHERE
END
SET @SQL = @SQL + ')) '
exec sp_executesql @SQL
END
(我需要在这里作为参数列表中的输出参数@TotalRowCount):
ALTER PROCEDURE [dbo].[_tournament_GetTournamentsByConveners]
(
@LastName varchar(100) = null ,
@Username varchar(256) = null ,
@Email varchar(100) = null ,
@IsWildcard bit = null,
@PageIndex int ,
@PageSize int,
@TotalRowCount int output
)
AS
答案 0 :(得分:1)
这是设计的。
动态SQL中@TotalRowCount的范围与存储过程中声明的@TotalRowCount的范围不同。也就是说,动态SQL有它自己的范围。
如果您坚持使用动态SQL,请执行此操作以将总行数添加到返回的记录集中
SELECT col1, col2,
COUNT(*) OVER () AS TotalRows
FROM ...
否则我们只有部分代码可以提供任何改进建议。您似乎有LINQ使用执行动态SQL调用存储过程。这太复杂了。
答案 1 :(得分:0)
您可以使用sp_executesql
声明输出参数。因此,要获得结果,请更改代码,如下所示。
在连接像这样的SQL代码时要小心,因为它极易受到SQL注入的攻击。</ p>
DECLARE @SQL nvarchar(4000)
SET @SQL = N'SELECT @TotalRowCount = COUNT(*) as TotalRowCount'
SET @SQL = @SQL + @WHERE
IF (LEN(@SUBWHERE) > 0)
BEGIN
SET @SQL = @SQL + @SUBWHERE
END
SET @SQL = @SQL + N')) '
exec sp_executesql @SQL, N'@TotalRowCount int output', @TotalRowCount output
你也可以表达这个更紧凑:
DECLARE @SQL nvarchar(4000)
SET @SQL = N'SELECT @TotalRowCount = COUNT(*) as TotalRowCount' + @WHERE + ISNULL(@SUBWHERE, N'') + N'))'
exec sp_executesql @SQL, N'@TotalRowCount int output', @TotalRowCount output