【问题标题】:How to return the rowcount of a dynamic sql query in SP?如何在SP中返回动态sql查询的行数?
【发布时间】:2011-03-02 19:46:59
【问题描述】:

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

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  

【问题讨论】:

  • 我缺少“LINQ 位”。如果有SP,就调用它? (LINQ2SQL 将生成支持out 值的存根。)
  • 使用 LINQ 时出现异常,我必须声明标量值 @TotalRowCount
  • 我不完全理解你的问题,但也许应该是:SELECT @TotalRowCount = COUNT(*) as TotalRowCount ... btw,你的 FROM 部分在哪里?我只看到 WHERE 部分。此外,您的查询中可能缺少一些空格。确保您的 @subwhere 包含两个左括号,而不是右括号。
  • 这是 SP 的问题——与 LINQ 无关 :-) 例如,尝试从 SQL Management Studio 运行它。

标签: sql sql-server stored-procedures


【解决方案1】:

这是设计使然。

动态 SQL 中@TotalRowCount 的范围与存储过程中声明的@TotalRowCount 的范围不同。也就是说,动态 SQL 有自己的作用域。

如果您坚持使用动态 SQL,请执行此操作以将总行数添加到返回的记录集中

SELECT col1, col2,
    COUNT(*) OVER () AS TotalRows
FROM ...

否则我们只有部分代码可以提供任何改进建议。您似乎让 LINQ 使用执行动态 SQL 调用存储的过程。这太令人费解了。

【讨论】:

  • 谢谢gbn。我在这里遵循相同的模式,从 linq 调用存储过程,该过程正在处理 sql 级别的分页。
【解决方案2】:

您可以使用sp_executesql 声明输出参数。因此,要获得结果,请更改代码,如下所示。

在连接这样的 SQL 代码时务必小心,因为它极易受到 SQL 注入的攻击。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 2012-07-05
    • 2014-01-09
    • 1970-01-01
    相关资源
    最近更新 更多