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