Visual studio 从只有nvarchar字段的表中推断数据类型?

Visual studio 从只有nvarchar字段的表中推断数据类型?,visual-studio,ssis,sql-server-2017,biml,ssis-2017,Visual Studio,Ssis,Sql Server 2017,Biml,Ssis 2017,我有一张这样的桌子: Create table landingzone.classes( teacher nvarchar(255) ,moment nvarchar(255) ,noOfStudents nvarchar(255) ,scheduledYesNo nvarchar(255) ) INSERT INTO [landingzone].[classes] ([teacher] ,[moment] ,[noOfStud

我有一张这样的桌子:

Create table landingzone.classes(
teacher nvarchar(255)
,moment nvarchar(255)
,noOfStudents nvarchar(255)
,scheduledYesNo nvarchar(255)
)

INSERT INTO [landingzone].[classes]
           ([teacher]
           ,[moment]
           ,[noOfStudents]
           ,[scheduledYesNo]) 
Select ' Henrov', '  01/07/2021' ,6 ,'True' 
union all 
Select ' Bill', '  01/05/2021' ,6 ,'False' 
union all
Select ' Henrov', '  31/07/2021' ,NULL ,NULL
Create table staging.classes(
teacher nvarchar(255)
,moment datetime
,noOfStudents int
,scheduledYesNo bit
)
我需要的是一个脚本来发现

  • [teacher]
    应该是
    nvarchar(255)
  • [moment]
    应该是
    时间戳
  • [noOfStudents]
    应该是
    int
  • [scheduledeyesno]
    应该是一个
    (或一个
    int
    ,值为1/0)
并创建如下表:

Create table landingzone.classes(
teacher nvarchar(255)
,moment nvarchar(255)
,noOfStudents nvarchar(255)
,scheduledYesNo nvarchar(255)
)

INSERT INTO [landingzone].[classes]
           ([teacher]
           ,[moment]
           ,[noOfStudents]
           ,[scheduledYesNo]) 
Select ' Henrov', '  01/07/2021' ,6 ,'True' 
union all 
Select ' Bill', '  01/05/2021' ,6 ,'False' 
union all
Select ' Henrov', '  31/07/2021' ,NULL ,NULL
Create table staging.classes(
teacher nvarchar(255)
,moment datetime
,noOfStudents int
,scheduledYesNo bit
)
然后是从
着陆区.classes
登台.classes
的数据传输

但是,它应该通过分析表dbo.test来实现这一点,而不是通过引用一些包含具有关联数据类型的列的名称的配置表。由于dbo.test中可能有大量记录,其中许多字段可能为空,因此它应该超过前200个字段(最好这个数字应该是可配置的)

landingzone中的表由其他流程交付,并应以当前形式(业务规则)显式保持现有

我认为挑战主要在于自动发现正确的数据类型


这可以在BIML中完成吗?

没有BIML方法可以帮助您检测数据类型

我在一个长期项目中,从大型机摄取无类型数据,我们对您正在做的事情采取了类似的方法。我们将数据按原样放入一个表中,该表具有该系统允许的最宽字符串类型*

我们编写了一个TSQL脚本,该脚本将取消激活表,然后生成N列,对数据进行分析。一系列测试如下所示(徒手编码,因此遵循精神而非文字):

这样做的目的是生成关于列外观的描述性统计数据—填充的频率、适合各种数据类型的百分比、最小/最大长度

我们遇到了哥查斯。 没有数据或数据稀疏。那很容易就是我们背后最大的一口。如果我没记错的话,NULLs会很高兴地转换成整数类型,所以一旦我们有了足够的数据,我们就有很多事情要做。如果没有太多数据,请将其保留为字符串;)

本地数据规则。我们遇到了罐装脚本无法处理的事情。主机使用插入符号
^
表示时间结束

日期和时间。204型可以应付3月32日。很明显,这和4月1日是一样的,对吗?3月31日24:30显然是4月1日00:30


*“哦,是的,我们确实有这些字段,可以存储二进制/非常长的字符串。我们没有告诉你这些吗?”

你说的“我需要的是一个发现…”的脚本是什么意思?从何处获取数据?您是否尝试过SQL的TRY_PARSE或TRY_CONVERT?您应该在创建表之前而不是之后对数据进行事实调查。因此,我个人建议您花时间学习数据,然后为以后的使用创建适当的表。我不怀疑有工具试图解释数据类型,但我也不怀疑它们是完美无缺的(对于堆栈溢出来说,工具推荐已经偏离了主题)。以JET/ACE为例;考虑到现有的限制条件,您只能希望输入字符串具有一定的一致性。例如,如果“字符串日期”的格式始终为“dd/MM/yyyy”,则可以应用一些逻辑。数字还有另一个问题,字符串整数应该不同于字符串小数,因为后者中总是有一个小数分隔符。布尔值应为真/假或1/0。事实上,@Larnu说的是,在开始翻译之前,你需要对这些输入字符串的格式是否一致有信心,但你永远无法确定正确的解释。我将使用BIML创建表格和包,将物品从着陆区转移到暂存区。之后,我将手动更正登台模式中的数据类型,并将包(由Biml创建)调整为适当的数据类型。不完全自动控制,但应节省一些时间