如何在SP中返回动态sql查询的rowcount?

时间:2011-03-02 19:47:00

标签: sql sql-server stored-procedures

我想使用类似于此处提到的linq返回动态sql查询的rowcount:

http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx

我正在使用动态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  

2 个答案:

答案 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