SSIS中的自动字符串模式匹配

时间:2018-07-04 12:59:44

标签: sql sql-server tsql ssis

我的客户希望通过识别列字段名称中的特定字符串模式('AAA','BBB'...)来对其中一个表中的自由文本列进行分类。他们为我提供了进行分类的查询:

SELECT  [Column],
CASE 
 WHEN UPPER([Column]) LIKE '%AAA%' 
   OR UPPER([Column]) LIKE '%BBB%'
   OR UPPER([Column]) LIKE '%CCC%' 
   OR UPPER([Column]) LIKE '%DDD%' 
   OR UPPER([Column]) LIKE '%EEE%'  
 THEN 'Category1'
 WHEN UPPER([Column]) LIKE '%FFF%' 
   OR UPPER([Column]) LIKE '%GGG%' 
   OR UPPER([Column]) LIKE '%HHH%' 
 THEN 'Category2'
 WHEN UPPER([Column]) LIKE '%III%' 
   OR UPPER([Column]) LIKE '%JJJ%'  
 THEN 'Category3'
 WHEN UPPER([Column]) LIKE '%KKK%'
   OR UPPER([Column]) LIKE '%LLL%'
   OR UPPER([Column]) LIKE '%MMM%'
 THEN 'Category4' END TYPE
FROM [Table]

这很好,但是问题是他们希望将来添加更多模式,而且他们无权访问源代码。因此,他们希望能够通过一个平面文件上传其模式,该文件将被提取并存储在这样的表中:

+-------+-----------+---------+
| Level | Category  | Pattern |
+-------+-----------+---------+
|     1 | Category1 | AAA     |
|     1 | Category1 | BBB     |
|     1 | Category1 | CCC     |
|     1 | Category1 | DDD     |
|     1 | Category1 | EEE     |
+-------+-----------+---------+
|     2 | Category2 | FFF     |
|     2 | Category2 | GGG     |
|     2 | Category2 | HHH     |
+-------+-----------+---------+
|     3 | Category3 | III     |
|     3 | Category3 | JJJ     |
+-------+-----------+---------+
|     4 | Category4 | KKK     |
|     4 | Category4 | LLL     |
|     4 | Category4 | MMM     |
+-------+-----------+---------+

因此,现在我试图确定是否存在使用模式表作为输入从上面设计CASE WHEN语句的任何自动方法(使用T-SQL或脚本)。 CASE WHEN的顺序也很重要,这就是为什么我添加了“级别”列。

SSIS将用于将类别分配给表中的每一行。 SSIS中是否有任何组件可以帮助我实现目标?

1 个答案:

答案 0 :(得分:1)

这里有两种可以与TSQL一起使用的解决方案。

1)循环更新(更快)。我假设Category上的[Table]为空,然后再进行更新。

DECLARE @MaxLevel INT = (SELECT ISNULL(MAX(Level), 0) FROM Category)

DECLARE @LevelIterator INT = 1

WHILE @LevelIterator <= @MaxLevel
BEGIN

    UPDATE T SET
        Category = C.Category
    FROM
        [Table] AS T
        INNER JOIN Category AS C ON UPPER(T.[Column]) LIKE '%' + C.Pattern + '%'
    WHERE
        C.Level = @LevelIterator AND
        T.Category IS NULL

    SET @LevelIterator += 1

END

2)大规模更新(较慢)

;WITH MinimumLevelMatch AS
(
    SELECT
        T.[Column],
        MinLevel = MIN(C.Level)
    FROM
        [Table] AS T
        INNER JOIN Category AS C ON UPPER(T.[Column]) LIKE '%' + C.Pattern + '%'
    GROUP BY
        T.[Column]
),
CategoryByLevel AS
(
    SELECT DISTINCT
        C.Level,
        C.Category
    FROM
        Category AS C
)
UPDATE T SET
    Category = C.Category
FROM
    [Table] AS T
    INNER JOIN MinimumLevelMatch AS M ON T.[Column] = M.[Column]
    INNER JOIN CategoryByLevel AS C ON M.MinLevel = C.Level

尝试避免使用SSIS来实现业务逻辑。将其用于主要目的集成系统