如何基于其他查询返回查询中的字段

时间:2018-08-11 18:00:26

标签: sql sql-server stored-procedures

这是我的情况,我在一个显示数据的角度应用程序中有一个网格。一切正常,我可以让用户选择网格中显示的列,但是由于我将其隐藏在客户端上,因此我仍然得到一些空白列。为了解决这个问题,我必须从返回的查询中删除不需要的列。我要在这里加上很多前缀。查询一会返回我用户希望在查询中看到的所有列。

DECLARE @Txt1 VARCHAR(MAX)
SET @Txt1=''

SELECT  @Txt1 = @Txt1 + tblA.column_name +','
FROM   [tbl_gridcolumns] as tblA
left join [dbo].[tbl_griduser] as tblB
on tblA.guid = tblB.column_guid
where tblA.master_guid = '43A4ED59-3515-4A19-B919-863D15A3DCBB' and 
tblb.user_guid = '8D6D24A5-D669-45DC-99AC-F257BDA133A4' and display =1

SELECT  LEFT(@Txt1,LEN(@Txt1)-1) AS txt

这将返回txt值

  

uid,sano,sapd,sasn,城市,州,邮编,运营商路由,fo_fullname,owner_absent_occupied,tract_number

到目前为止很好,我现在希望能够将txt值用作列表列,我想在存储过程中返回它,如下所示。

create PROCEDURE [dbo].[sp_getFarmCount]    
-- Add the parameters for the stored procedure here
@p_offset as int = 0,
@p_nbrrows as int = 50,
@p_sasn as Varchar(50),
@p_city as varchar(50),
@p_fo_full_name as varchar(150),
@p_carrier_route as varchar(10),
@p_tract_number as varchar(50),
@p_owner_absent_occupied as varchar(1)
AS
 SELECT 
 // this static part of columns i would like to replace with the dynamic 
 list which is stored in txt
   [uid]
  ,[sano]
  ,[sapd]
  ,[sasn]
  ,[city]
  ,[state]
  ,[zip]
  ,[carrier_route]
  ,[fo_fullname]
  ,[mailing_addr]
  ,[mailing_city]
  ,[mailing_state]
  ,[mailing_zip]
  ,[saun]
  ,[sqft_structure]
  ,[rooms]
  ,[sale_value]
  ,[sale_date]
  ,[lot_sqft]
  ,[year_build]
  ,[owner_absent_occupied]
  ,[tract_number]
  // End od static column list

 FROM [cmr_crm].[dbo].[tbl_FarmMaster]

 where sasn like CONCAT(@p_sasn, '%')  
 and city like CONCAT(@p_city, '%')  
 and fo_fullname like CONCAT('%', @p_fo_full_name, '%')  
 and carrier_route like CONCAT(@p_carrier_route, '%')   
 and tract_number like CONCAT(@p_tract_number, '%')  
 and owner_absent_occupied like CONCAT(@p_owner_absent_occupied, '%')

 order by Sasn,cast(sano as int) 
 OFFSET @p_offset ROWS FETCH NEXT @p_nbrrows ROWS ONLY

我将如何实现这一目标,因为我需要将第一个查询放入存储过程中,或者我将其设为2,然后返回然后从第二个查询中调用第一个查询并使用结果?

2 个答案:

答案 0 :(得分:0)

您可以使用sp_executeSQL来构建和运行这样的动态SQL。即:

create PROCEDURE [dbo].[sp_getFarmCount]    
@collist as varchar(4000),
-- Add the parameters for the stored procedure here
@p_offset as int = 0,
@p_nbrrows as int = 50,
@p_sasn as Varchar(50),
@p_city as varchar(50),
@p_fo_full_name as varchar(150),
@p_carrier_route as varchar(10),
@p_tract_number as varchar(50),
@p_owner_absent_occupied as varchar(1)
AS
 begin

DECLARE @sql nvarchar(4000);  
DECLARE @definition nvarchar(1000);  

SET @sql =  N'SELECT ' + @collist +
       'from myTable    
       WHERE someColumn = @someParameter';

SET @definition = N'@someParameter int';  

SET @IntVariable = 197;  
EXECUTE sp_executesql @sql, @definition,  
                      @someParameter = @p_offset; 

end

(@ p_offset只是一个任意示例)

答案 1 :(得分:0)

经过一番反复的尝试,我最终得到了以下解决方案,该解决方案可以按预期工作,并且由于我拥有的parm的nbr项而变得更简单。总是有一种做事的方法。也许这可以帮助某人

ALTER PROCEDURE [dbo].[sp_getFarmCountTest] 
-- Add the parameters for the stored procedure here
@p_offset as int = 0,
@p_nbrrows as int = 50,
@p_sasn as Varchar(50),
@p_city as varchar(50),
@p_fo_full_name as varchar(150),
@p_carrier_route as varchar(10),
@p_tract_number as varchar(50),
@p_owner_absent_occupied as varchar(1)
AS

BEGIN

Declare @val Varchar(MAX);

---Take the First query  result into temp table ---

select
tblA.column_name
INTO #temp
from [tbl_gridcolumns] as tblA
left join [dbo].[tbl_griduser] as tblB
on tblA.guid = tblB.column_guid
where tblA.master_guid = '43A4ED59-3515-4A19-B919-863D15A3DCBB' and tblb.user_guid = '8D6D24A5-D669-45DC-99AC-F257BDA133A4' and display =1

--join the values retuned from first query
Select @val = COALESCE(@val + ', ' + column_name, column_name) From  #temp
Select @val;

SET @val= 'Select '+ @val +
' FROM [cmr_crm].[dbo].[tbl_FarmMaster] '+
' where sasn like '+''''+ CONCAT(@p_sasn, '%') +''''+
' and city like '+ ''''+CONCAT(@p_city, '%') +''''+
' and fo_fullname like '+ ''''+ CONCAT('%', @p_fo_full_name, '%')+''''+
' and carrier_route like '+ ''''+CONCAT(@p_carrier_route, '%')+''''+
' and tract_number like '+ ''''+CONCAT(@p_tract_number, '%')+''''+
' and owner_absent_occupied like '+ ''''+CONCAT(@p_owner_absent_occupied, '%')+''''+

' order by Sasn,cast(sano as int) '+
'OFFSET ' +Convert(VARCHAR(100),@p_offset) +' ROWS FETCH NEXT '+ 
 CONVERT(VARCHAR(100),@p_nbrrows) + ' ROWS ONLY '


 Execute (@val)