【问题标题】:How Can I Set Value To output parameter in sql stored procedure within select statement?如何在select语句中的sql存储过程中设置输出参数的值?
【发布时间】:2014-07-14 20:42:48
【问题描述】:

我在 sql server 2008 中有存储过程,用于对从数据库中的产品表返回的数据进行分页。我想要的是在同一个选择语句中返回总页数

ALTER PROCEDURE [dbo].[SP_GetProducts]
    @PageSize int = 10, 
    @PageNumber int = 1,
    @ProductCode nvarchar(50) = null,
    @ProductName nvarchar(100) = null,
    @TotalPages int = null output 
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;


    SELECT TOP (@PageSize) *, @TotalPages = COUNT(*)  FROM (
        SELECT ROW_NUMBER() OVER (ORDER BY ProductId ASC) offset, * FROM (
         SELECT *, count(*) over() AS TotalRows
         FROM Products
        ) myquery
        ) paginator
        WHERE offset >= (((@PageSize * @PageNumber) - @PageSize)) +1 and offset <= (@PageSize * @PageNumber)

【问题讨论】:

  • 您是否尝试通过count(*) * pagesize 获取总数?你的代码有点混乱。
  • 不确定我是否理解您的代码,但您可以执行多个选择以返回多个输出参数。
  • 没有@TotalPages = COUNT() 代码工作,但我需要在同一选择语句的输出参数中返回 Count()
  • 如果我执行多个选择以返回多个输出参数,那么程序的性能如何
  • 将结果集存储在临时表中。从该表中获取两个输出参数,而不是运行完整查询,然后从完整查询中选择 count(*)。

标签: sql sql-server sql-server-2008


【解决方案1】:

您不能同时从 Select 语句中检索值并为变量赋值。在您的特定情况下,因为您只分配从您的选择语句返回的数字或行,您可以使用稍微不同的方法来获得您想要的。

ALTER PROCEDURE [dbo].[SP_GetProducts]
    @PageSize int = 10, 
    @PageNumber int = 1,
    @ProductCode nvarchar(50) = null,
    @ProductName nvarchar(100) = null,
    @TotalPages int = null output 
AS
BEGIN
    SET NOCOUNT ON;

    SELECT TOP (@PageSize) * 
     FROM (
           SELECT ROW_NUMBER() OVER (ORDER BY ProductId ASC) offset, * 
              FROM (
                    SELECT *, count(*) over() AS TotalRows
                    FROM Products
           ) myquery
        ) paginator
        WHERE offset >= (((@PageSize * @PageNumber) - @PageSize)) +1 
         AND offset <= (@PageSize * @PageNumber)

    -- here assign value to your output parameter using the following

     SELECT @TotalPages = @@ROWCOUNT;
END

注意

避免使用SELECT *,而是使用列名,仅使用您实际想要检索的列。

【讨论】:

    猜你喜欢
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    相关资源
    最近更新 更多