从具有多个返回值的select语句中检索输出参数值以及其他返回值

时间:2017-03-27 07:01:22

标签: sql-server-2016

我有一个存储过程的输出参数,它的值必须从两个内部select语句返回。我有@nTotalRecords作为我的输出参数,该值将来自下面的select语句我应该如何从别名表TBL中检索输出参数,在这种情况下,我试着这样做

create procedure [usp_GetMessagesbyReferenceID1]
(        
@nRowsPerPage               int,
@nPage                      int,
@nTotalRecords              int output 
) as
select  
    TBL.createdate,
    TBL.templateid,
    @nTotalRecords=TBL.TotalRecords
    from
     (
            select
                  message.createdate,
                  message.templateid,
                  count(1) over() as TotalRecords
            from
                  nts.Messages as [message]    
     )  as TBL

我正在尝试这种方式设置输出参数,但它不起作用它抛出以下错误A SELECT statement that assigns a value to a variable must not be combined with data retrieval operations.是否有任何可能实现这一点。 ?或者我在语法上犯了任何错误,请帮助我。

注意: 如果只返回一个值(输出参数值),则从select语句中检索输出参数可以正常工作,但我的要求是当我的select语句返回多个值(包括输出参数)时它应该正常工作。

3 个答案:

答案 0 :(得分:1)

我已经尝试了很多来征服这一点,但是我已经通过这种方式实现了这一点,我已经写了一个选择语句以获得总记录数。我不确定答案是否完美有效,但它对我来说效果很好。如果还有其他方法,请告诉我。

create procedure [usp_GetMessagesbyReferenceID1]
(        
@nRowsPerPage               int,
@nPage                      int,
@nTotalRecords              int output 
) as
select  
   TBL.createdate,
   TBL.templateid
from
   (
      select
         message.createdate,
         message.templateid
      from
         nts.Messages as [message]    
   )  as TBL

 select 
    @nTotalRecords = count(1)
 from 
    nts.Messages as [message]

答案 1 :(得分:0)

iex(1)> Timex.today |> Timex.format!("{ISOdate}Z")
"2017-03-27Z"

您的代码应该是这样的。删除了Select中的第1列。考虑到内部查询只返回TotalRecords的一个值,这将起作用。如果它返回多个,那么最后一个值将被分配给@nTotalRecords

答案 2 :(得分:0)

根据讨论,下面的代码将帮助您获取TotalRecords(带有单个值的int)和CreatedDate(带有逗号分隔日期值的字符串)。

create procedure [usp_GetMessagesbyReferenceID1]
(        
@nRowsPerPage               int,
@nPage                      int,
@nTotalRecords              int output,
@CreatedDate                 varchar(500) output 
) as

select @CreatedDate=
  STUFF (( SELECT ','+ CAST(T.dates as varchar(15))
           FROM nts.Messages T
           FOR XML PATH('')),1,1,'')
 select @nTotalRecords=TBL.TotalRecords    
 from
     ( select dates, count(1) over() as TotalRecords
       from nts.Messages
     )  as TBL