有没有可以检查varchar数据并建议合适的数据类型的工具?

时间:2018-08-23 18:59:34

标签: sql-server ssis etl

使用大型varchar或nvarchar字段将外部数据导入到暂存表中是一种很普遍的做法,以允许对数据验证和下游转换进行更多控制。

因此,在创建新的ETL时,必须创建具有正确数据类型的目标表。

我敢肯定,必须有一个工具可以分析(n)varchar列中的数据并建议合适的目标列数据类型,其方式与“导入数据向导”对平面文件数据源的方式非常相似。

我一直手动完成此操作,但是在为100多个列表创建ETL时,它变得非常繁琐。必须有一种工具可以让我90%地自动到达那里。

2 个答案:

答案 0 :(得分:2)

让我们假设2012年以后,您有一个像这样的表。

Col1        Col2            Col3
2018-05-23  Another Value   25.26
2018-06-30  John Smith      3635.556365
2018-07-01  Jane Doe        NULL

然后我们可以得到一些XML的乐趣。 Cross Apply B将行转换为XML,而Cross Apply C将“动态”取消数据透视。这是一个简单的聚合。

;with cte as (
Select C.*
 From  YourTable A
 Cross Apply ( values (cast((Select A.* for XML RAW) as xml))) B(XMLData)
 Cross Apply (
                Select ColNr  = Row_Number() over (Order by (select null))
                      ,Item   = a.value('local-name(.)','varchar(100)')
                      ,Value  = a.value('.','varchar(max)')
                 From  B.XMLData.nodes('/row')  as C1(n)
                 Cross Apply C1.n.nodes('./@*') as C2(a)
             ) C
)
Select ColNr       = max(ColNr)
      ,Item 
      ,CntValues   = sum(1) 
      ,MinStrLen   = min(len(Value))
      ,MaxStrLen   = max(len(Value))
      ,MinValue    = min(Value)
      ,MaxValue    = max(Value)
      ,PctNumeric  = sum(IIF(try_convert(money,Value) is null,0,1)) / sum(convert(money,1))
      ,MinNumeric  = min(try_convert(money,Value))
      ,MaxNumeric  = max(try_convert(money,Value))
      ,MaxDecimal  = max(case when try_convert(money,Value) is not null and charindex('.',Value)>0 then len(parsename(Value,1)) else 0 end)
      ,PctDate     = sum(IIF(try_convert(date,Value) is null,0,1)) / sum(convert(money,1))
      ,MinDateTime = min(try_convert(datetime,Value))
      ,MaxDateTime = max(try_convert(datetime,Value))
 From  cte
 Group By Item
 Order By 1

返回

enter image description here

请注意:这不是完整的答案,int也不提出建议,但会为通用表添加一些见识。

答案 1 :(得分:1)

我知道问题已经解决,@ John很棒。

我想在一个有趣的问题中分享我的想法。

在这种情况下,脚本必须涵盖许多测试用例,并且已经过全面测试。

我的脚本经过一个或两个小示例测试。

如果符合要求,则可以将其开发为完全健壮的脚本。

[ts] Cannot find name 'React'.
(property) JSX.IntrinsicElements.slot: JSXElements.SlotAttributes