如何从存储过程的表中的列中获取输出参数

Posted

技术标签:

【中文标题】如何从存储过程的表中的列中获取输出参数【英文标题】:How to get Output parameter from a column in table for a stored procedure 【发布时间】:2021-12-28 13:28:52 【问题描述】:

我有这样的存储过程:

create procedure sp_testsp
(
@vc_order_by varchar(100),
@int_start_index INT,
@int_grid_size INT,
@count bigint output
)
as 
begin 

select * from 
(select ROW_NUMBER() over
(order by 
case @vc_order_by = '' then tab1.int_id end desc) AS row,
*,
COUNT(tab1.int_id) OVER() as totalRowCount 
from
(select * from tbl_test) tab1) tab2
where row BETWEEN CONVERT(VARCHAR, @int_start_index) and CONVERT(VARCHAR,(@int_start_index-1) + @int_grid_size);

set @count  = 0;

end

我们可以通过以下方式执行上述存储过程:

DECLARE @size bigint;
EXEC sp_testsp '', 1,5, @size output;
SELECT @size;

编写的sp提供基于分页的数据,我们可以通过在@int_grid_size中传递一个数字来检索100条或任意数量的记录。

表格输出如下:

row      int_id      vc_name    totalRowCount     
1          5            a            107
2          6            ab           107
3          7            abc          107
4          8            abcd         107
5          10           abcc         107

如果我们使用 where 条件,最后一列给出表的总记录数或总记录数。

我想在存储过程的'@count'中输出totalRowCount的任何一列值。

我不能使用@@ROWCOUNT,因为它只发送 sp 输出的记录数,即在本例中为 5,但实际记录为 107。

只是想知道有没有办法。任何帮助都是值得的。谢谢。

编辑:

我尝试了这样的方法,它确实有效:

create procedure sp_testsp
@param1 nvarchar(800),
@count bigint output
as 
begin 

select * from tbl_test tt where tt.col1 = @param1;

set @count = select Count(*) from tbl_test tt where tt.col1 = @param1;

end

这个问题是我必须调用一次查询,然后再次为@count 调用查询。这很有效,但需要大量时间进行大型查询。

【问题讨论】:

为什么最后每次都将set @count = 0;设置为0? 首先选择ID并计入临时表。然后,您可以从临时表中设置@count 变量,然后从临时表中选择连接回 Id 上的源表以获取要返回的列。另请查看offset fetch 分页功能。 @Mark-我不知道如何将“计数”设置为表记录,所以为了提问,我将其保留为 0。这是我的问题,如何将 'count' 设置为 totalRowCount ? 【参考方案1】:

你可以通过临时表做到这一点

 select * into #temp from 
     (select ROW_NUMBER() over
      (order by 
case @vc_order_by = '' then tab1.int_id end desc) AS row,
*,
COUNT(tab1.int_id) OVER() as totalRowCount 
from
(select * from tbl_test) tab1) tab2
where row BETWEEN CONVERT(VARCHAR, @int_start_index) and CONVERT(VARCHAR,(@int_start_index-1) + @int_grid_size);

select top 1 @count=totalRowCount from #temp

select * from #temp --you can exclude totalRowCount 

【讨论】:

以上是关于如何从存储过程的表中的列中获取输出参数的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SQL Server 存储过程中的 3 列中获取 MAX 值?

用于从具有多个条件的多个表中的多个列中获取数据的存储过程

跳出查询以在存储过程中从单独的表中获取 where 子句

如何获取存储过程以输出从 SQL*Plus 中的 select 语句返回的表?

创建 pl/sql 过程以从不同的表中获取不同的列

如何使用 Snowflake Javascript 存储过程或函数遍历表中的所有列?