2012-03-27 73 views
1

我面临着一个巨大的挑战,我会闯入2个问题(不确定是否会更好地提出两个单独的问题)。自动将平面文件导入MS SQL Server 2008

经过反馈,我会将第二个问题提出一个新问题。

概述: 我有一个很大的文件列表正在写入一个目录(每天一个),其中包含大量的细节。 我需要以某种方式获取文件的内容为尽可能好的数据库格式,然后运行查询。

问题1:

自动将文件导入到现有表中。 这些文件被命名为[DD] - [MMM] .txt(例如27-Mar.txt)。

我认为这应该是直接使用服务器导入/导出向导将原始文本转储到单列行。

任何人都可以提供一个方法来扫描文件和只导入新的,有没有办法做到这一点使用BULK INSERT

+0

由于两个问题会更好 - 两者都需要相当复杂的响应。 – 2012-03-27 13:20:37

+0

认为可能是这种情况,我编辑了原来的问题,很快就会发布后续问题。 – bendataclear 2012-03-27 14:12:03

回答

3

重述了第一个问题:

  • 有一个文件夹
  • 包含文件
  • 曾经每个

你能一次删除文件中的文件来加载数据的X号数据被加载?你可以归档它们吗(把它们移到不同的文件夹,或者只是重命名它们)?或者是否必须假设他们生活在这个文件夹中,或者至少有足够长的时间来克服多种数据运行方式?

如果文件可以在其数据加载后归档,则没有什么大问题。如果这些文件会持续存在,那么您需要记录文件已被加载和处理的事实,并且在后续运行中找到每个发现的文件,然后检查日志以查看它是否已被加载。 (注意:由于文件名不包含年份,因此在使用364天后需要处理一些棘手的问题,假设当前年份适用,并且您应该很好 - 除非这些文件永远都在?在这种情况下,嗯,我猜的文件获取与明年的通覆盖)

对于只使用SQL的解决方案,你需要:

  • 加载文件
  • 列表
  • 根据您的LoadLog检查它
  • 处理新文件

的代码段概述这是如何完成(其中@TargetFolder将是一个参数):

DECLARE @Command nvarchar(2000) 

CREATE TABLE #ImportOSFiles (FileName varchar(128)) 

SET @Command = 'DIR "' + @TargetFolder + '\*.txt" /b' 

INSERT #TestFiles 
execute master.dbo.xp_cmdshell @Command 

DELETE #ImportOSFiles 
where FileName is null 

(请注意,使用的xp_cmdshell的可能会或可能不会接受你的DBA和/或架构。)

遍历这个表对于以前没有记录的所有文件的内容,并运行BULK INSERT:

CREATE TABLE #LoadData 
(Item varchar(1000) not null) 


SET @Command = 'BULK INSERT #LoadData 
from ' + @ThisFile + ' 
with 
    (
    FieldTerminator = '''' -- No delimiter 
    --,RowTerminator = '' -- Default is CR/LF 
) 
' 

EXECUTE sp_exectuesql @Command 

这应该产生的数据每行一个未解析一行。下一步可能是将其复制到更永久的表中,以便您可以将文件名(日期)与该文件中的数据相关联。

INSERT #LoatData_Step2 (FileName, DataRow) 
select @TargetFile, Item 
    from #LoadData 

然后,所有你需要做的是分析数据,足够复杂的拍摄对象,我不打算进入这里。在SSIS中可能会有一些复杂的功能来解析这种格式的数据......如果存在,那么使用SSIS加载数据可能会更好,因为它具有不使用xp_cmdshell的文件夹/文件循环结构。但是如果SSIS不能自然处理数据格式,我认为你必须做一些RBAR解析或过于复杂的用户定义的函数模式匹配外部应用连接。

+0

不幸的是,文件已修复,无法在导入后重命名/移动,我认为您发布的解决方案可能有效,并保留导入文件的日志。此外,我还没有想过年度结束时会发生什么情况,编写文件的系统自从2月份以来一直保持活跃状态​​,所以在我可以测试之前还需要一段时间。 – bendataclear 2012-03-27 14:24:40

+1

菲利普以这种方式加载文件方面有出色的经验,我认为解决方案将按照所述方式工作。此问题也是您可以使用Integration Services处理的问题,您可以在其中创建ForEach文件循环并将其分解为两个步骤:1)检查是否已针对FileLog处理该文件,以及2)是否加载了文件新。我认为记录你处理的每个文件是正确的行为,不管方法如何。您将受益于审计跟踪。平面文件可能很有趣。 – Vinnie 2012-03-27 14:34:47