if OBJECT_ID('tempdb..#Conditions') is not null drop table #Conditions create table #Conditions ( ConditionID int identity(1,1) primary key, Name varchar(100), [Text] varchar(200), [Value] varchar(200) ) insert #Conditions(Name, [Text], [Value]) select ' ', 'pa.city in (''Berlin'', ''Bonn'') and ppc.Name in (''Byke'')' , 'sd.OrderQty * pp.Weight' insert #Conditions(Name, [Text], [Value]) select ' ', 'pa.city in (''Berlin'', ''Bonn'') and ppc.Name not in (''Byke'')', 'sd.OrderQty * pp.Weight' insert #Conditions(Name, [Text], [Value]) select ' ', 'pa.city not in (''Berlin'', ''Bonn'')', 'sd.OrderQty * pp.Weight'
if OBJECT_ID('tempdb..#ConditionAtoms') is not null drop table #ConditionAtoms create table #ConditionAtoms ( AtomID int identity(1,1) primary key, ConditionID int, GroupNumber int, -- , > 0 , < 0 - Field varchar(50), -- Value varchar(1000) -- )
insert #ConditionAtoms(ConditionID, GroupNumber, Field, Value) select 1, 1, 'pa.city', 'Berlin' insert #ConditionAtoms(ConditionID, GroupNumber, Field, Value) select 1, 1, 'pa.city', 'Bonn' insert #ConditionAtoms(ConditionID, GroupNumber, Field, Value) select 1, 2, 'ppc.Name', 'Byke' insert #ConditionAtoms(ConditionID, GroupNumber, Field, Value) select 2, 1, 'pa.city', 'Berlin' insert #ConditionAtoms(ConditionID, GroupNumber, Field, Value) select 2, 1, 'pa.city', 'Bonn' insert #ConditionAtoms(ConditionID, GroupNumber, Field, Value) select 2, -1, 'ppc.Name', 'Byke' insert #ConditionAtoms(ConditionID, GroupNumber, Field, Value) select 3, 1, '<SQL>' , '1=1' insert #ConditionAtoms(ConditionID, GroupNumber, Field, Value) select 3, -1, 'pa.city', 'Berlin' insert #ConditionAtoms(ConditionID, GroupNumber, Field, Value) select 3, -1, 'pa.city', 'Bonn'
-- insert #ConditionAtoms(ConditionID, GroupNumber, Field, Value) select 1, 1, 'pa.city', 'Berlin' insert #ConditionAtoms(ConditionID, GroupNumber, Field, Value) select 1, 1, 'pa.city', 'Bonn' -- insert #ConditionAtoms(ConditionID, GroupNumber, Field, Value) select 2, 1, '<CONDITION>', '1' insert #ConditionAtoms(ConditionID, GroupNumber, Field, Value) select 2, 2, 'ppc.Name', 'Byke' -- , () insert #ConditionAtoms(ConditionID, GroupNumber, Field, Value) select 3, 1, '<CONDITION>', '1' insert #ConditionAtoms(ConditionID, GroupNumber, Field, Value) select 3, -1, '<CONDITION>', '2' -- insert #ConditionAtoms(ConditionID, GroupNumber, Field, Value) select 4, 1, '<SQL>', '1=1' insert #ConditionAtoms(ConditionID, GroupNumber, Field, Value) select 4, -1, '<CONDITION>', '1'
create function test.ConditionSQL( @ConditionID int , @Lvl int = 0 ) returns varchar(max) begin declare @Ret varchar(max) if @Lvl < 100 with Data as ( select * ,[SQL] = '( ' + case when Field = '<SQL>' then value when Field = '<CONDITION>' then test.ConditionSQL( try_convert(int, value), @Lvl+1 ) else Field + ' = ''' + Replace( Value, '''', '''''') + '''' end + ')' ,[Row] = ROW_NUMBER() over(partition by GroupNumber order by Field ) from ConditionAtoms ca where ConditionID = @ConditionID ), Build as ( select GroupNumber, [Row], [Sql] = convert(varchar(max), [SQL]), MaxRow = (select max([ROW]) from data d where d.GroupNumber = data.GroupNumber ) from Data where [Row] = 1 union all select Build.GroupNumber, Data.Row, Build.SQL + ' or ' + data.SQL , Build.MaxRow from Build join Data on Build.GroupNumber = data.GroupNumber and Build.Row + 1 = Data.Row ) select @Ret = iif( @Ret is null, '', @Ret + ' and ' ) + iif( GroupNumber < 0 , ' not ', '' ) + ' (' + [SQL] + ') ' from Build where [Row] = [MaxRow] return IsNull( @Ret, 'Error ConditionID = ' + format(@ConditionID, '0') ) end
print dbo.ConditionSQL(1,0) print dbo.ConditionSQL(2,0) print dbo.ConditionSQL(3,0) print dbo.ConditionSQL(4,0) --------------------------------------- (( pa.city = 'Berlin') or ( pa.city = 'Bonn')) (( (( pa.city = 'Berlin') or ( pa.city = 'Bonn')) )) and (( ppc.Name = 'Byke')) not (( (( (( pa.city = 'Berlin') or ( pa.city = 'Bonn')) )) and (( ppc.Name = 'Byke')) )) and (( (( pa.city = 'Berlin') or ( pa.city = 'Bonn')) )) not (( (( pa.city = 'Berlin') or ( pa.city = 'Bonn')) )) and (( 1=1))
Source: https://habr.com/ru/post/270499/
All Articles