【问题标题】:How to pass SELECT statement result as parameter to function in stored procedure in SQL Server?如何将 SELECT 语句结果作为参数传递给 SQL Server 的存储过程中的函数?
【发布时间】:2014-07-23 10:58:52
【问题描述】:

在我的存储过程中,我有 SELECT 语句。我想将这些 SELECT 语句的结果作为参数传递给函数。请告诉我如何将参数传递给 SQL Server 中的函数。

我的存储过程:

CREATE PROCEDURE PositionReport                                
AS 
BEGIN 
   (select COUNT(ID) from Submissions where SubmissionStatus = 'Status1') Status1,                    
   (select COUNT(ID) from Submissions where SubmissionStatus = 'Status2') Status2,                    
   dbo.[fnGetTotal](Status1,Status1) Total                             
END

功能:

CREATE FUNCTION [dbo].[fnGetTotal](@Status1 int, @Status1 int)
RETURN varchar(100) AS
BEGIN
   DECLARE @Total varchar(100);

   SELECT @Total = @Status1 + @Status1
   RETURN @Total                           
END

我原来的存储过程:

CREATE PROCEDURE [dbo].[Usp_GetJobsPositionReport]
    @AccountID int, 
    @Userid int,
    @JobTitle varchar(100),
    @ClientID varchar(8000),
    @ContactID varchar(8000),
    @PageNum int,
    @PageSize int,
    @SortExpression varchar(1000),
    @isExport bit = 0
AS             
BEGIN
   SELECT @sqlQuery = 'SELECT * FROM (SELECT distinct ROW_NUMBER() over (ORDER BY ' + @SortExpression + ') as SNo, Jobs.JobNo, Jobs.JobID, Jobs.JobTitle, VendorClients.CompanyName Client, VendorContacts.FirstName + '' ''  + VendorContacts.LastName as ContactName, Users.FirstName + '' ''+ Users.LastName CreatedBy, (select COUNT(SubmissionID) from CandidateSubmissions where SubmissionStatus in(''Submitted'',''Screening'') and InterviewType is null and CandidateSubmissions.jobid=jobs.jobid) Submitted, (select COUNT(SubmissionID) from CandidateSubmissions where SubmissionStatus not in (''Potential'',''Rejected'',''Attached'',''CandidateWithdrawn'',''Backout'',''Matched'') and CandidateSubmissions.jobid=jobs.jobid) Active,      
                   (select COUNT(SubmissionID) from CandidateSubmissions where SubmissionStatus = ''Shortlisted'' and CandidateSubmissions.jobid=jobs.jobid) ShortListed,                                        
                   (select COUNT(SubmissionID) from CandidateSubmissions where SubmissionStatus in(''Submitted'',''Screening'') and InterviewType = ''Phone'' and CandidateSubmissions.jobid=jobs.jobid) PhoneInterview,                                   

                   (select COUNT(SubmissionID) from CandidateSubmissions where SubmissionStatus in(''Submitted'',''Screening'') and InterviewType = ''Face2Face'' and CandidateSubmissions.jobid=jobs.jobid) F2FInterview,                    
                   (select COUNT(SubmissionID) from CandidateSubmissions where SubmissionStatus in(''Submitted'',''Screening'') and InterviewType = ''Web'' and CandidateSubmissions.jobid=jobs.jobid) WebInterview,                                       
                   (select COUNT(SubmissionID) from CandidateSubmissions where SubmissionStatus = ''UnderReview'' and CandidateSubmissions.jobid=jobs.jobid) UnderReview,                                        

                   (select COUNT(SubmissionID) from CandidateSubmissions where SubmissionStatus = ''OfferMade'' and CandidateSubmissions.jobid=jobs.jobid) OfferMade,                    
                   (select COUNT(SubmissionID) from CandidateSubmissions where SubmissionStatus = ''OfferRevoked'' and CandidateSubmissions.jobid=jobs.jobid) OfferRevoked,                    
                   (select COUNT(SubmissionID) from CandidateSubmissions where SubmissionStatus = ''OfferNegotiating'' and CandidateSubmissions.jobid=jobs.jobid) OfferNegotiating,                    
                   (select COUNT(SubmissionID) from CandidateSubmissions where SubmissionStatus = ''OfferAccepted'' and CandidateSubmissions.jobid=jobs.jobid) OfferAccepted,                    
                   (select COUNT(SubmissionID) from CandidateSubmissions where SubmissionStatus = ''OfferRejected'' and CandidateSubmissions.jobid=jobs.jobid) OfferRejected,            
                   (select COUNT(SubmissionID) from CandidateSubmissions where SubmissionStatus = ''Screening'' and CandidateSubmissions.jobid=jobs.jobid) Screening,                                                    
                   (select COUNT(SubmissionID) from CandidateSubmissions where SubmissionStatus = ''Joined'' and CandidateSubmissions.jobid=jobs.jobid) Joined,    

                    Jobs.PositionType TypeOfHire,REPLACE(CONVERT(VARCHAR(11), Jobs.PostedDate, 106), '' '', ''-'') PostedDate,                                          
                    PrimaryIndustry = case Jobs.PrimaryIndustry                                          
                                      when ''Select'' then ''''                           
                                      else Jobs.PrimaryIndustry                                          
                                    end,                                      
                    JobCategory = case Jobs.JobCategory                                          
                                   when ''Select'' then ''''                                          
                                   else Jobs.JobCategory                                          
                                end,'                    

                 select @sqlLinkQuery = 'Education = case Jobs.MinimumEducation                                          
                                       when ''Select'' then ''''                                          
                                       else Jobs.MinimumEducation                                          
                                   end,                                           


                       FROM Jobs WITH(NOLOCK)      
                        INNER JOIN Users WITH(NOLOCK) ON Jobs.UserID = Users.UserID and Users.IsActive=1                        
                       INNER JOIN AccountUsers WITH(NOLOCK) ON AccountUsers.UserID = Jobs.UserID      
                       INNER JOIN CityList WITH(NOLOCK) ON Jobs.JobLocation = CityList.CityID                                                 
                       INNER JOIN JobAssignedUsers WITH(NOLOCK) ON Jobs.JobID = JobAssignedUsers.JobID                                            

                       where Jobs.JobStatus = ''Open'' AND jobAssignedUsers.userid = '+ CONVERT(varchar(9),@Userid)+ ' AND VendorClients.AccountID = '+ CONVERT(varchar(9),@AccountID)+ @strJobTitle + @strClientID + @strContactID +'                   
                   ) as Result'                    

   SELECT @subSql = ' where  Result.SNo >= '+ CONVERT(varchar(9), @boundPageNum) +' and Result.SNo <= '+ CONVERT(varchar(9), @boundPageSize)                                              

   IF(@isExport = 0)                
    BEGIN                
         EXEC (@sqlQuery + @sqlLinkQuery + @subSql)                    
         EXEC('SELECT COUNT(*)TotalRows FROM ('+@sqlQuery + @sqlLinkQuery+')a')                
    END                
   ELSE              
    BEGIN                
         EXEC (@sqlQuery + @sqlLinkQuery)                
    END                     
END

【问题讨论】:

  • SQL server 是 2005 还是 2008?
  • 在查看编辑历史记录之前,我对这个问题感到非常困惑。似乎有人(嗨@juergend!)偷偷地将参数添加到函数调用中!
  • @DavidG:你在说什么?除了格式化,问题没有添加任何内容。
  • @juergend 查看编辑历史。原文是dbo.fnGetTotal Total,您的编辑是dbo.[fnGetTotal](Status1,Status1) Total
  • @DavidG:我想这是一个竞争条件。 OP 和我可能同时编辑。我只点击了该帖子上的格式按钮,没有输入任何字符。

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


【解决方案1】:

如下更改您的程序

CREATE PROCEDURE PositionReport                                                                                                             
as                                                                                                                                      
BEGIN 

DECLARE @Status1 int
DECLARE @Status2 int


select @Status1=COUNT(ID) from Submissions where SubmissionStatus = 'Status1'                   
select @Status2=COUNT(ID) from Submissions where SubmissionStatus = 'Status2'                    

SELECT @Status1 as Status1,@Status2 as Status2
       ,dbo.[fnGetTotal](@Status1,@Status1) Total                             
END

但我不认为需要单独的函数,除非你正在做更复杂的事情。

【讨论】:

  • 对不起,其实我的sp如下。例如,我已经给出了。
  • 我更新了我的SP,请检查并给我任何建议。谢谢。
【解决方案2】:

只需将 select 语句本身(作为字符串)传递给存储的函数,而不是其结果,然后在函数内部运行它。

要从字符串运行一些 SQL 命令,请使用:

sys.sp_executesql

例子:

EXEC sys.sp_executesql N'select ''Hello world'' as Result'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-30
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 2012-03-15
    相关资源
    最近更新 更多