動的に作成されたフィルターをSQLServerのストアドプロシージャのパラメーターとして渡し、データをフィルター処理するにはどうすればよいですか?

クリスチャンバレンシア

いくつかの動的フィルターtblMarketingCampaignFiltersSQL Serverのテーブルから入力)を渡して、それらをTargetColumninと比較するにはどうすればよいtblMarketingUsersですか?

明確にするために、フィルターを生成してInputTypes割り当てられたものを入力するためのすべてのコードがあります(数値、日付、文字列、またはチェックボックス付きのブール値のみ)が、ページはユーザーが必要なだけ追加することになっています(nフィルタ)。

これが私のテーブルがどのように定義されているかを示す画像です

使用したテーブル

I must compare the filters, with columns (to be added) in tblMarketingUsers.

Examples:

  • LastLoginDate > '20150701' if it is a Date,
  • Advanced Profile Status > 50(percent) if it is a number,
  • InBothSystems = 0 if it is a checkbox checked

This is my filter part of the form in the page

クライアント側の部分

By now, I have only 4 filters, it could be 10, I don't know.

Thanks.

PS: I think that I am missing a TableTarget in tblMarketingCampaignFilters, if the system have to look on another table, not only tblMarketingUsers, but it doesn't matter so much.

PS2: I am considering passing the filters as text, with the comma-separated style, and then insert this into transMarketingCampaignFilters, but still don't know how to compare them dynamically, my boss says "use cursors in SQL"

EDIT

Thanks for the replies, and comments.

This is an approach of what I am thinking to do. I will need to add Operator column in tblMarketingCampaignFilters (it will store something like : '=' , '<', '>', 'LIKE') , and btw, this stored procedure will assume that a Campaign with the filters has already submitted on the form, and all data is stored on transMarketingCampaignFilters

    CREATE PROCEDURE usp_MarketingUsersGetFiltered
    -- Add the parameters for the stored procedure here
    @CampaignId int,
    @Debug BIT = 0
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    declare @sql varchar(max) = '', @Nsql nvarchar(max), @DatabaseId INT;
    -- Insert statements for procedure here

set @DatabaseId = (SELECT DatabaseId from tblMarketingCampaigns where Id=@CampaignId); select @sql += ' AND '+quotename(f.TargetColumn) + f.Operator + case f.InputType when 'int' then cast(cf.Value as int) else quotename(cf.Value,'''') end from dbo.transMarketingCampaignFilters as cf join dbo.tblMarketingCampaignFilters as f on cf.CampaignFilterId = f.Id where cf.CampaignId = @CampaignId set @sql = ' select MarketingUserId, FirstName, LastName, Email, CompanyId from dbo.tblMarketingUsers where DatabaseId = @DatabaseId '+ @sql+' OPTION (RECOMPILE)'; if @Debug = 1 print @sql; set @sql = @Nsql; exec sys.sp_executesql @Nsql,N'@DatabaseId INT',@DatabaseId; END GO

Cristhian Valencia

Finally, I've written Javascript code (a little complex) to :

  • Create dynamic filters and its respective inputs
    1. My actual types are only 4 (int,bit,varchar,date)
    2. For 'int' create dynamically an <input type="number">
    3. For 'date' create dynamically an <input type="text"> , with a date plugin
    4. Etc...
  • I've created an array to store the id's of my filters and send to the server via AJAX call (and the complete form)

Then in the server code (C#) I've written code to:

  • Save the campaign details.
  • Loop over the parameter array.
    1. Save each filter added with the CampaignId provided by the AddCampaign stored procedure (after save the campaign), the filter id provided by each select value of the form, and the value provided on the generated input.

And then in SQL Server, I've just used the stored procedure that I've supplied on the question, a little modified:

CREATE PROCEDURE usp_MarketingUsersGetFiltered
-- Add the parameters for the stored procedure here
@CampaignId int,
@Debug BIT = 0
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
declare @sql varchar(max) = '', @Nsql nvarchar(max), @DatabaseId INT;
-- Insert statements for procedure here

set @DatabaseId = (SELECT DatabaseId from tblMarketingCampaigns where Id=@CampaignId);
select @sql +=  ' AND '+quotename(f.TargetColumn) + f.Operation + 
            case f.InputType 
            when 'int' then cf.Value
            when 'bit' then cf.Value
            else quotename(cf.Value,'''')               
            end
from dbo.transMarketingCampaignFilters as cf
join dbo.tblMarketingCampaignFilters as f
on cf.CampaignFilterId = f.Id
where cf.CampaignId = @CampaignId

 set @sql = '
 select MarketingUserId,
        FirstName,
        LastName,
        tblMarketingUsers.Email as UserEmail,
        CompanyId,
        CompanyName,
        Address1,
        Address2,
        City,
        SmartInsightProfile,
        LastLoginDate,
        AdvancedProfileStatus
 from dbo.tblMarketingUsers 
 left join dbo.tblCompanies on tblMarketingUsers.CompanyId=tblCompanies.Id
 where DatabaseId = @DatabaseId
 '+ @sql+'
 OPTION (RECOMPILE)';

if @Debug = 1 print @sql;
set @Nsql = @sql;
exec sys.sp_executesql @Nsql,N'@DatabaseId INT',@DatabaseId;

END
GO

My tables are something like this

テーブル

Where tblMarketingCampaignFilters stores rows similar to :

(Id、Name、InputType、TargetColumn、Operator)

(1、 'Advanced Profile Status'、 'int'、 'AdvancedProfileStatus'、 '<')

(2、 '最終ログイン日'、 '日付'、 'LastLoginDate'、 '<')

(3、 'Geo Location(City)'、 'varchar'、 'C​​ity'、 'LIKE')

そして最終結果:

 select MarketingUserId,
        FirstName,
        LastName,
        tblMarketingUsers.Email as UserEmail,
        CompanyId,
        CompanyName,
        Address1,
        Address2,
        City,
        SmartInsightProfile,
        LastLoginDate,
        AdvancedProfileStatus
 from dbo.tblMarketingUsers 
 left join dbo.tblCompanies on tblMarketingUsers.CompanyId=tblCompanies.Id
 where DatabaseId = 3
  AND [City]LIKE'%salta%' AND [SmartInsightProfile]!=1 AND [LastLoginDate]<'20150708' AND [AdvancedProfileStatus]<42
 OPTION (RECOMPILE)

助けてくれてありがとう!

これが最善の方法ではないことはわかっていますが、今ではうまくいきます。

これが他の誰かを助けることを願っています。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ