我需要将大量CSV文件导入SQL中的相应表中。我正在尝试编写一个存储过程来导入任何这些CSV文件,使用许多参数来设置文件名,目的地名称等。
到目前为止简单。问题来自于这个DB的结构。每个数据表都有许多(通常是5个)具有设置格式的列,然后是您想要的许多数据列。然后有一组数据验证表,其中包含这5列可包含的特定值集。所以问题是,当我从CSV导入时,我需要验证导入的每一行是否符合这些验证表中的条件,基本上验证表中有一行具有与5匹配的数据。导入数据中的列。
如果没有,那么它需要向日志写一个错误而不是导入它,如果是的话,它应该导入它。
这是我的意思的一个例子:
数据表(导入的数据将在哪里)
|datatype|country|currency| datacolumn1 | datacolumn|
|1 | 2 | GBP | 10000 | 400 |
|3 | 4 | USD | 10000 | 400 |
验证表
|datatype|country|currency|
|1 |2 |GBP |
|2 |3 |USD |
所以第一行是有效的,它在前3列的验证表中有匹配的记录,但第二行不是也应该被拒绝。
增加的问题是每个表都可以引用不同的验证表(尽管许多表引用相同的表),因此必须检查的列的数量和名称通常不同。
我的第一个问题是如何在从CSV导入时逐行检查,有没有办法在不先导入临时表的情况下这样做? 之后,以通用方式检查列是否匹配的最佳方法是什么,尽管事实上列的名称和数量会根据导入的表而发生变化。
答案 0 :(得分:2)
您可以使用此< - p>将csv的内容导入到某些临时表中
SELECT * into newtable FROM
OPENROWSET ('MSDASQL', 'Driver={Microsoft Text Driver (*.txt; *.csv)};DefaultDir={Directory Path of the CSV File};',
'SELECT * from yourfile.csv');
在某些sql表中获得数据后,可以使用内部联接来验证数据并缩小到有效行。
SELECT A.*,B.* FROM newtable A
INNER JOIN validation_table B ON A.Datatype = B.Datatype
INNER JOIN validation_table C ON A.Country = C.Country
INNER JOIN validation_table D ON A.Currency = D.Currency
根据您的验证规则,这应该为您提供有效的行。
答案 1 :(得分:1)
SSIS可让您在加载数据时检查,过滤和处理数据。我不知道有任何其他本机SQL工具可以做到这一点。如果没有SSIS(或第三方工具),您必须先将文件中的所有数据加载到某种“临时”表(#temp或专用永久物)中,然后从那里开始工作。
@Pavan Reddy的OPENROWSET解决方案应该可行。我已经使用了视图,我首先确定了源文件中的行,在目标表上构建了一个“映射”视图,然后BULK INSERTED进入视图(这也允许你在“跳过的列”上玩默认游戏)
(只需提一下,您可以从存储过程启动SSIS包,使用xp_cmdshell调用DTEXEC。它很复杂,需要大量参数,但可以完成。)