Da sich diese Regeltabelle regelmäßig ändern kann und nicht jedesmal Adaptierungen im Code notwendig sind, baue ich mir das Mapping-SQL dynamisch anhand der Tabelle auf.
Im unten angeführten Beispiel wird standardmäßig ein Vergleich mit = durchgeführt, jedoch bietet es auch die Funktionalität mehrere Werte mit "incl." bzw "excl." ein-/auszuschließen.
Die Sortierung dieser Regeln wird anhand der Spalte "Priority" vorgenommen. Beim ersten Treffer wird der Wert aus "Category" dem Geschäft zugewiesen. Weiters gibt es noch ein Auffangelement, bei dem alle Bedingungen auf "NULL" gesetzt wurden. Dieses wird für den ELSE-Zweig des CASE-WHEN-Konstrukts genutzt.
CREATE TABLE [dbo].[PrioritySetup]( [Priority] [int] NULL, [Product] [varchar](255) NULL, [AccountType] [varchar](255) NULL, [AssetLiability] [varchar](255) NULL, [BusinessUnit] [varchar](255) NULL, [Category] [varchar](255) NOT NULL ) ON [PRIMARY] INSERT INTO dbo.PrioritySetup VALUES (1,'Giro','ABC','A','Unit1','1000'), (2,'Giro','ABC','P','Unit1','1001'), (3,'Giro','ABC','A','excl. |Unit2|Unit3|Unit4|','1003'), (4,'Giro',NULL,'P',NULL,'1100'), (5,'Giro',NULL,NULL,NULL,'1200'), (6,'Saving',NULL,'A',NULL,'2000'), (7,'Saving',NULL,'P','incl. |Unit2|Unit3|','2100'), (8,'Saving',NULL,'P',NULL,'2200'), (8,'Credit',NULL,'A',NULL,'3000'), (9,'Credit',NULL,'P',NULL,'3100'), (10,NULL,NULL,'A',NULL,'5000'), (11,NULL,NULL,'P',NULL,'5000'), (12,NULL,NULL,NULL,NULL,'9000') DECLARE @Priority int ,@Product varchar(255) ,@AccountType varchar(255) ,@AssetLiability varchar(255) ,@BusinessUnit varchar(255) ,@Category varchar(255) DECLARE @query varchar(max) DECLARE @helper int DECLARE @EmptyPrioTable int = 0 DECLARE C_Prio CURSOR FOR SELECT [Priority] ,RTRIM([Product]) ,RTRIM([AccountType]) ,RTRIM([AssetLiability]) ,RTRIM([BusinessUnit]) ,[Category] FROM [dbo].[PrioritySetup] -- Open - Fetch - While - Close - Deallocate OPEN C_Prio FETCH NEXT FROM C_Prio INTO @Priority ,@Product ,@AccountType ,@AssetLiability ,@BusinessUnit ,@Category SET @query = 'ALTER PROCEDURE [dbo].[PriorityMapper] AS BEGIN ' + CHAR(13)+CHAR(10) IF @@FETCH_STATUS = 0 BEGIN SET @query = @query + 'INSERT INTO dbo.MappedResult (PositionKey,Planungskategorie) ' + CHAR(13)+CHAR(10) SET @query = @query + ' SELECT A.PositionKey ' + CHAR(13)+CHAR(10) SET @query = @query + ' ,CASE ' + CHAR(13)+CHAR(10) END ELSE BEGIN -- Falls Tabelle Planungskategorie_Prio leer ist SET @query = @query + 'PRINT ''Planungskategorietabelle leer!'' ' + CHAR(13)+CHAR(10) SET @EmptyPrioTable = 1 END WHILE @@FETCH_STATUS = 0 BEGIN SET @helper = 0 SET @query = @query + ' WHEN ' IF (@Product IS NOT NULL) BEGIN IF @helper = 1 SET @query = @query + ' AND ' IF CHARINDEX('excl.', @Product) > 0 OR CHARINDEX('incl.', @Product) > 0 BEGIN IF CHARINDEX('excl.', @Product) > 0 BEGIN SET @Product = REPLACE(REPLACE(@Product,'excl. ',''),' ','') SET @Product = SUBSTRING(@Product, 2, (LEN(@Product) - 2)) SET @Product = '''' + REPLACE(@Product,'|',''',''') + '''' SET @query = @query + 'A.Product NOT IN ( ' + @Product + ')' END IF CHARINDEX('incl.', @Product) > 0 BEGIN SET @Product = REPLACE(REPLACE(@Product,'incl. ',''),' ','') SET @Product = SUBSTRING(@Product, 2, (LEN(@Product) - 2)) SET @Product = '''' + REPLACE(@Product,'|',''',''') + '''' SET @query = @query + 'A.Product IN ( ' + @Product + ')' END END ELSE BEGIN SET @query = @query + 'A.Product = ''' + @Product + ''' ' END SET @helper = 1 END IF (@AccountType IS NOT NULL) BEGIN IF @helper = 1 SET @query = @query + ' AND ' IF CHARINDEX('excl.', @AccountType) > 0 OR CHARINDEX('incl.', @AccountType) > 0 BEGIN IF CHARINDEX('excl.', @AccountType) > 0 BEGIN SET @AccountType = REPLACE(REPLACE(@AccountType,'excl. ',''),' ','') SET @AccountType = SUBSTRING(@AccountType, 2, (LEN(@AccountType) - 2)) SET @AccountType = '''' + REPLACE(@AccountType,'|',''',''') + '''' SET @query = @query + 'A.AccountType NOT IN ( ' + @AccountType + ')' END IF CHARINDEX('incl.', @AccountType) > 0 BEGIN SET @AccountType = REPLACE(REPLACE(@AccountType,'incl. ',''),' ','') SET @AccountType = SUBSTRING(@AccountType, 2, (LEN(@AccountType) - 2)) SET @AccountType = '''' + REPLACE(@AccountType,'|',''',''') + '''' SET @query = @query + 'A.AccountType IN ( ' + @AccountType + ')' END END ELSE BEGIN SET @query = @query + 'A.AccountType = ''' + @AccountType + ''' ' END SET @helper = 1 END IF (@AssetLiability IS NOT NULL) BEGIN IF @helper = 1 SET @query = @query + ' AND ' IF CHARINDEX('excl.', @AssetLiability) > 0 OR CHARINDEX('incl.', @AssetLiability) > 0 BEGIN IF CHARINDEX('excl.', @AssetLiability) > 0 BEGIN SET @AssetLiability = REPLACE(REPLACE(@AssetLiability,'excl. ',''),' ','') SET @AssetLiability = SUBSTRING(@AssetLiability, 2, (LEN(@AssetLiability) - 2)) SET @AssetLiability = '''' + REPLACE(@AssetLiability,'|',''',''') + '''' SET @query = @query + 'A.AssetLiability NOT IN ( ' + @AssetLiability + ')' END IF CHARINDEX('incl.', @AssetLiability) > 0 BEGIN SET @AssetLiability = REPLACE(REPLACE(@AssetLiability,'incl. ',''),' ','') SET @AssetLiability = SUBSTRING(@AssetLiability, 2, (LEN(@AssetLiability) - 2)) SET @AssetLiability = '''' + REPLACE(@AssetLiability,'|',''',''') + '''' SET @query = @query + 'A.AssetLiability IN ( ' + @AssetLiability + ')' END END ELSE BEGIN SET @query = @query + 'A.AssetLiability = ''' +@AssetLiability + ''' ' END SET @helper = 1 END IF (@BusinessUnit IS NOT NULL) BEGIN IF @helper = 1 SET @query = @query + ' AND ' IF CHARINDEX('excl.', @BusinessUnit) > 0 OR CHARINDEX('incl.', @BusinessUnit) > 0 BEGIN IF CHARINDEX('excl.', @BusinessUnit) > 0 BEGIN SET @BusinessUnit = REPLACE(REPLACE(@BusinessUnit,'excl. ',''),' ','') SET @BusinessUnit = SUBSTRING(@BusinessUnit, 2, (LEN(@BusinessUnit) - 2)) SET @BusinessUnit = '''' + REPLACE(@BusinessUnit,'|',''',''') + '''' SET @query = @query + 'A.BusinessUnit NOT IN ( ' + @BusinessUnit + ')' END IF CHARINDEX('incl.', @BusinessUnit) > 0 BEGIN SET @BusinessUnit = REPLACE(REPLACE(@BusinessUnit,'incl. ',''),' ','') SET @BusinessUnit = SUBSTRING(@BusinessUnit, 2, (LEN(@BusinessUnit) - 2)) SET @BusinessUnit = '''' + REPLACE(@BusinessUnit,'|',''',''') + '''' SET @query = @query + 'A.BusinessUnit IN ( ' + @BusinessUnit + ')' END END ELSE BEGIN SET @query = @query + 'A.BusinessUnit = ''' + @BusinessUnit + ''' ' END SET @helper = 1 END SET @query = @query + ' THEN ''' + @Category + '''' + CHAR(13)+CHAR(10) FETCH NEXT FROM C_Prio INTO @Priority ,@Product ,@AccountType ,@AssetLiability ,@BusinessUnit ,@Category END; CLOSE C_Prio DEALLOCATE C_Prio IF @EmptyPrioTable = 0 BEGIN SET @query = REPLACE(@query,'WHEN THEN', 'ELSE') SET @query = @query + ' END AS MappedCategory'+ CHAR(13)+CHAR(10) SET @query = @query + ' FROM ( ' + CHAR(13)+CHAR(10) SET @query = @query + ' SELECT PositionKey, AssetLiability, Product, AccountType, BusinessUnit FROM EXP.GiroAccounts' + CHAR(13)+CHAR(10) SET @query = @query + ' UNION SELECT PositionKey, AssetLiability, Product, AccountType, BusinessUnit FROM EXP.SavingAccounts' + CHAR(13)+CHAR(10) SET @query = @query + ' UNION SELECT PositionKey, AssetLiability, Product, AccountType, BusinessUnit FROM EXP.LoanAccounts' + CHAR(13)+CHAR(10) SET @query = @query + ' UNION SELECT PositionKey, AssetLiability, Product, AccountType, BusinessUnit FROM EXP.TreasuryAccounts ' + CHAR(13)+CHAR(10) SET @query = @query + ' UNION SELECT PositionKey, AssetLiability, Product, AccountType, BusinessUnit FROM EXP.OtherAccounts' + CHAR(13)+CHAR(10) SET @query = @query + ' ) A' + CHAR(13)+CHAR(10) END SET @query = @query + CHAR(13)+CHAR(10) + ' END' -- Absetzen des dynamisch generierten UPDATE-SQLs PRINT @query EXEC (@query)