いくつかの動的フィルター(tblMarketingCampaignFilters
SQL Serverのテーブルから入力)を渡して、それらをTargetColumn
inと比較するにはどうすればよいtblMarketingUsers
ですか?
明確にするために、フィルターを生成してInputTypes
割り当てられたものを入力するためのすべてのコードがあります(数値、日付、文字列、またはチェックボックス付きのブール値のみ)が、ページはユーザーが必要なだけ追加することになっています(nフィルタ)。
これが私のテーブルがどのように定義されているかを示す画像です
I must compare the filters, with columns (to be added) in tblMarketingUsers
.
Examples:
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
Finally, I've written Javascript code (a little complex) to :
<input type="number">
<input type="text">
, with a date pluginThen in the server code (C#) I've written code to:
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'、 'City'、 '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]
コメントを追加