使用大型varchar或nvarchar字段将外部数据导入到暂存表中是一种很普遍的做法,以允许对数据验证和下游转换进行更多控制。
因此,在创建新的ETL时,必须创建具有正确数据类型的目标表。
我敢肯定,必须有一个工具可以分析(n)varchar列中的数据并建议合适的目标列数据类型,其方式与“导入数据向导”对平面文件数据源的方式非常相似。
我一直手动完成此操作,但是在为100多个列表创建ETL时,它变得非常繁琐。必须有一种工具可以让我90%地自动到达那里。
答案 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
返回
请注意:这不是完整的答案,int也不提出建议,但会为通用表添加一些见识。
答案 1 :(得分:1)
我知道问题已经解决,@ John很棒。
我想在一个有趣的问题中分享我的想法。
在这种情况下,脚本必须涵盖许多测试用例,并且已经过全面测试。
我的脚本经过一个或两个小示例测试。
如果符合要求,则可以将其开发为完全健壮的脚本。
[ts] Cannot find name 'React'.
(property) JSX.IntrinsicElements.slot: JSXElements.SlotAttributes