实体框架中的复杂存储过程 [英] Complex Stored Procedure in Entity Framework

查看:80
本文介绍了实体框架中的复杂存储过程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望在将存储过程导入为函数导入时从存储过程中获取列信息。但我没有获得复杂存储过程的列信息。它包含动态查询。如何解决此问题以从存储过程中获取选择结果。



I want to get columns information from stored procedure while importing stored procedure as function import. But I am not getting columns information for complex stored procedure. It contains dynamic query. How can i solve this problem to get select result from stored procedure.

CREATE PROCEDURE [Directory].[usp_Person_BasicPersonSearch_New]                                                                                                  
(                  
@Flage varchar(20)=null,                                                                                    
@KeywordSearch varchar(50)=NULL,                                                                                   
@PersonName varchar(50)=NULL,                                                                                        
@LastName varchar(50)=NULL,                                                                                         
@PersonType int=NULL,                                                                                         
@Organization varchar(50)=NULL,                
--@PageNum int,                  
--@PageSize int,                                                                                           
@UserId varchar(50)=null,                              
@SearchCriteria varchar(10)=NULL                                                                                
)                                                                                                  
AS                                                                                                  
BEGIN                                                                                        
declare @tab table(value int)                                                                                                          
 declare @Alpha table(alphabets varchar(100))                                                                                           
 BEGIN TRY                                                                  
  SET NOCOUNT ON                                                        
DECLARE @Sql varchar(Max)                                                                                   
SET @Sql=''                               
                              
declare @PersonId int                              
                              
Select @PersonId=PersonId from Directory.Person where UserId=@UserId                              
                 
                                         
if(@SearchCriteria='Default')                              
Begin                              
declare @mainorgtab table (organizationid int)                            
insert into @mainorgtab                            
select distinct OrganizationId from Directory.PersonRoleOrganization where PersonId = @PersonId                        
AND (RoleUnassignDate>GETDATE() or RoleUnassignDate is null)                        
--                            
                            
declare @intFlag int                                  
 SET @intFlag = 1                                  
                                   
 while (@intFlag <=100)                                  
 begin                             
                            
insert into @mainorgtab                
select a.OrganizationId/*,b.organizationid,c.PersonId */from Directory.Organization a, @mainorgtab b /*,Directory.PersonRoleOrganization c*/                            
where a.ParentOrganizationId = b.organizationid  and a.OperatingStatus = 'active'                             
and (OrganizationCloseDate is null or (OrganizationCloseDate > GETDATE()))                            
and a.OrganizationTypeId not in (select OrganizationTypeId from Directory.OrganizationType where OrganizationTypeName = 'class')                            
and Not exists (select 1 from @mainorgtab where organizationid = a.OrganizationId)                            
                            
 if @@ROWCOUNT = 0                                   
 break                                  
                            
 set @intFlag = @intFlag + 1                                  
                                   
 end                             
                            
 ;                            
 select PersonId,FirstName,LastName,PersonTypeName, OrganizationName into #test from (                            
 select distinct p.PersonId,p.FirstName,p.LastName,pt.PersonTypeName, o.OrganizationName                             
 from directory.PersonRoleOrganization pro                          
 inner join Directory.person p on pro.PersonId = p.PersonId                          
 inner join Directory.PersonType pt on pt.PersonTypeId = p.PersonTypeId                          
 inner join Directory.Organization o on pro.OrganizationId = o.OrganizationId           
 inner join Directory.Status s on s.StatusId = p.StatusId and  s.StatusName in('Active','Inactive')                   
 inner join @mainorgtab m on m.organizationid = o.OrganizationId                          
 where                             
              
 --(LTRIM(P.FirstName) LIKE @PersonPagination or  @PersonPagination IS NULL)  AND                         
  (RoleUnassignDate>GETDATE() or RoleUnassignDate is null)--480070                            
 and o.OrganizationTypeId not in (select OrganizationTypeId from Directory.OrganizationType where OrganizationTypeName = 'class')                       
 and (o.OrganizationCloseDate is null or (o.OrganizationCloseDate > GETDATE()))                            
 AND (P.IsCase=0 OR P.IsCase IS NULL)                             
 )a                            
                      
 select * from (                            
 select ROW_NUMBER() over (order by firstname) rownum,personid,FirstName,LastName,PersonTypeName,                            
 STUFF((select ', '+organizationname from #test c1 where c1.PersonId = #test.PersonId for xml path('')),1,1,'') Organization                            
 from #test group by personid,FirstName,LastName,PersonTypeName                            
 )a                         
 --where rownum between (@PageNum - 1) * @PageSize+ 1 AND @PageNum * @PageSize       
 order by 1                 
                         
                    
 drop table #test                              
                      
                              
End                              
Else                                 
Begin                                      
                         
   if(@Flage='Search')                                                                                      
   BEGIN                                                                   
 SET @Sql='                                                                                        
 SELECT PersonId,FirstName,LastName,LTRIM(RTRIM(PersonTypeName))[PersonTypeName],LTRIM(RTRIM(Organization)) [Organization]                                                                                      
 FROM (                                                                                        
 SELECT t.PersonId,t.FirstName,t.LastName,t.PersonTypeName,t.Organization                                                                                                
 FROM                                                                                           
 (                                                                                                
 SELECT distinct P.PersonId,                                             
 P.FirstName[FirstName]                                            
 ,P.LastName[LastName]                                                                                         
 ,stuff(                                                                           
 (                                                                                          
 select '', ''+ LPT.PersonTypeName                                                                         
 from (select distinct PersonId,PersonTypeId from  Directory.PersonInformationDomain)  LPID                                              
 inner join Directory.PersonType LPT on LPID.PersonTypeId=LPT.PersonTypeId                                                   
 where LPID.PersonId = P.PersonId for XML path('''')                                                                                          
 ),1,1,'''') as PersonTypeName                                                                 
                                                                                       
 ,stuff(                                                                                          
 (                                                                                          
 select '', ''+ LO.OrganizationName                                                                                           
 from (select distinct PersonId,OrganizationId,RoleUnassignDate from  Directory.PersonRoleOrganization)  LPID                                                                                
 inner join Directory.Organization LO on LPID.OrganizationId=LO.OrganizationId                                                                     
 AND (CONVERT(date,LPID.RoleUnassignDate) > convert(date, getdate()) or LPID.RoleUnassignDate is null)                                                                      
 where LPID.PersonId = P.PersonId for XML path('''')                                                                                          
 ),1,1,'''') as Organization                                                                                          
                                                                                               
 FROM Directory.Person P                                                                 
 LEFT OUTER JOIN Directory.PersonInformationDomain PID ON PID.PersonId=P.PersonId                                                                          
 LEFT OUTER JOIN Directory.PersonRoleOrganization PRO ON PRO.PersonId=P.PersonId                                           
 AND (CONVERT(date,PRO.RoleUnassignDate) > convert(date, getdate()) or PRO.RoleUnassignDate is null)                                                                                                             
 LEFT JOIN Directory.PersonType PT ON PID.PersonTypeId=PT.PersonTypeId                                                                                              
 LEFT JOIN Directory.Organization O ON O.OrganizationId=PRO.OrganizationId                                      
 INNER JOIN Directory.Status S ON P.StatusId=S.StatusId and  S.StatusName in(''Active'',''Inactive'')                                                                                              
 WHERE 1=1 AND (P.IsCase=0 OR P.IsCase IS NULL)'                                              
                                                      
 IF(@PersonName IS NOT NULL)                                                          
  SET @Sql=@Sql + ' AND LTRIM(P.FirstName) LIKE '''+@PersonName+''''                                                     
                                                                                     
 IF (@LastName IS NOT NULL)                                                                                                
  SET @Sql=@Sql + ' AND LTRIM(P.LastName) LIKE '''+@LastName+''''                                                                                      
                                                                                     
 IF(@PersonType IS NOT NULL)                                                                                         
  SET @Sql=@Sql + ' AND PID.PersonTypeId='+ CAST(@PersonType as Varchar)+''                                                                                           
                                                                                     
 IF(@Organization IS NOT NULL)                                                                                         
  SET @Sql=@Sql + ' AND LTRIM(O.OrganizationName) like '''+@Organization+''''                                                    
                                           
                       
 SET @Sql= @Sql +')t )tt'                                                   
 --WHERE  tt.RowNumber BETWEEN ('+ CAST(@PageNum as VARCHAR) +'- 1) * '+ CAST(@PageSize as VARCHAR)+' + 1 AND '+ CAST(@PageNum as VARCHAR)+' * '+CAST(@PageSize as VARCHAR)+''                  
 PRINT @Sql                                                                              
 EXEC (@Sql)              
                                                                          
   END                                                   
                                                                                   
Else if(@Flage='KeyWordSearch')                                                                                    
   Begin                                                                                            
 SET @Sql='SELECT PersonId,FirstName,LastName,LTRIM(RTRIM(PersonTypeName))[PersonTypeName],LTRIM(RTRIM(Organization)) [Organization]                  
 FROM (                                                               
 SELECT t.PersonId,t.FirstName,t.LastName,t.PersonTypeName,t.Organization                                                                                                              
 FROM (                                                                                                
 SELECT distinct P.PersonId,                                             
  P.FirstName[FirstName]         
,P.LastName[LastName]                                                                                          
                                                                                          
 ,stuff(                                                                      
 (                                                                    
 select '', ''+ LPT.PersonTypeName                                          
 from (select distinct PersonId,PersonTypeId from  Directory.PersonInformationDomain)  LPID                                                                                          
 inner join Directory.PersonType LPT on LPID.PersonTypeId=LPT.PersonTypeId                                                         
 where LPID.PersonId = P.PersonId for XML path('''')                 
 ),1,1,'''') as PersonTypeName                                                                                            
                                     
 ,stuff(                                                                                          
 (           
 select '', ''+ LO.OrganizationName                                                    
 from (select distinct PersonId,OrganizationId,RoleUnassignDate from  Directory.PersonRoleOrganization)  LPID                                                                                          
 inner join Directory.Organization LO on LPID.OrganizationId=LO.OrganizationId                                                                     
 AND (CONVERT(date,LPID.RoleUnassignDate) > convert(date, getdate()) or LPID.RoleUnassignDate is null)                                                                                          
 where LPID.PersonId = P.PersonId for XML path('''')                                                                                          
 ),1,1,'''') as Organization                                                                  
                                                                                               
 FROM Directory.Person P                                                                                               
 LEFT OUTER JOIN Directory.PersonInformationDomain PID ON PID.PersonId=P.PersonId                                      
 LEFT OUTER JOIN Directory.PersonRoleOrganization PRO ON PRO.PersonId=P.PersonId                                         
 AND (CONVERT(date,PRO.RoleUnassignDate) > convert(date, getdate()) or PRO.RoleUnassignDate is null)                                                                                            
 LEFT JOIN Directory.PersonType PT ON PID.PersonTypeId=PT.PersonTypeId                                                                                              
 LEFT JOIN Directory.Organization O ON O.OrganizationId=PRO.OrganizationId                                                                           
 INNER JOIN Directory.Status S ON P.StatusId=S.StatusId AND s.StatusName in(''Active'',''Inactive'')                                                                                                   
 WHERE 1!=1 AND (P.IsCase=0 OR P.IsCase IS NULL)  '                                               
                                                 
  IF(@KeywordSearch IS NOT NULL)                                                                             
  SET @Sql=@Sql                                             
  + ' OR LTRIM(P.FirstName) LIKE '''+@KeywordSearch+'''' + ' OR LTRIM(P.MiddleName) LIKE '''+@KeywordSearch+''''+ ' OR LTRIM(P.PreferredFirstName) LIKE '''+@KeywordSearch+''''           
  + ' OR P.UserId LIKE '''+@KeywordSearch+'''' + ' OR LTRIM(P.LastName) LIKE '''+@KeywordSearch+'''' + ' OR LTRIM(PT.PersonTypeName) LIKE '''+@KeywordSearch+''''                                            
  + ' OR LTRIM(O.OrganizationName) LIKE '''+@KeywordSearch+''''                                            
                                              
 SET @Sql= @Sql +')t )tt'                                                      
                                                                               
 EXEC (@Sql)                                                                   
  Print (@Sql)                                                                  
              
   end                                
   End                               
                                                                
 END TRY                                                                                      
 BEGIN CATCH                                                                                                  
                                                                                        
 END CATCH      
 SET NOCOUNT OFF                                                                                          
END   





任何人帮帮我。



Anybody help me.

推荐答案

你将无法获得专栏由于动态SQL,来自存储过程的信息。您可以做的是将动态SQL的结果存储在临时表或变量表中,并将该表中的选择作为最后一个语句。



如果问题是due to columns dynamically being added to the SELECT statement in the dynamic SQL, then there is nothing you will be able to do.
You won't be able to get column information from the stored procedure because of the dynamic SQL. What you can do is store your results of the dynamic SQL in a temp or variable table and make your select from that table as the last statement.

If the issue is due to columns dynamically being added to the SELECT statement in the dynamic SQL, then there is nothing you will be able to do.


这篇关于实体框架中的复杂存储过程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆