可能最直接的方法是创建一个具有固定宽度平面文件的 SSIS 包作为数据源。我会将您的目的地设置为与您的最终表格明显不同的东西(即使用“原始数据”模式,甚至使用名为“原始数据”的单独数据库)。您可以使用此初始映射来创建具有建议数据类型的表(但您确实需要确保您了解您的数据)。
SSIS
完成此操作后,您可以在 SSIS 中创建一个 ForEach 循环容器,该容器遍历具有这些平面文件源和原始目标的特定文件夹。如果这是一次性的,您可以通过将 SQL Server Data Tools 安装到您当前的 Visual Studio 2010 安装(如果有)来完成此操作,或者安装程序将在 VS 2010 Shell 中安装 SSDT(如果您没有它) . 如果这不是一次性的,那么您将需要查看安装 SSIS 的许可,以便将其部署为可以安排定期运行的包。
如果失败了,您可以通过打开 SSMS、右键单击目标数据库、单击任务、导入数据、选择平面文件源、固定宽度目标、映射源来生成表模式(您将经历创建这些列,如果你真的有 > 100),然后生成一个创建表脚本。
但是,如果你真的只有那三列......
CREATE TABLE schema rawdata AUTHORIZATION <pick an owner here>;
CREATE TABLE rawdata.rawfields (
fieldname varchar(8), -- i'm actually unclear here because
-- the next column's name/purpose is unclear
fieldsize int, -- or other numeric datatype
fieldcomment varchar(255)
);
然后,您可以编写一个快速的 C# 或 PowerShell 脚本来迭代包含文件的目录。这看起来像:
C#
string fieldname, fieldsize, fieldcomments;
var files = System.IO.Directory.GetFiles("path", "*.ext");
foreach (var file in files)
{
var lines = System.IO.File.ReadAllLines(file);
foreach (var line in lines)
{
fieldname = line.Substring(0, 8);
fieldsize = line.Substring(9, 1);
fieldcomments = line.Substring(10, 73);
}
}
从这里开始,我将建立与 SQL Server 实例的连接,创建参数化插入命令并将数据插入变量中。
批量插入
创建格式文件:
<?xml version="1.0"?>
<BCPFORMAT
xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharFixed" LENGTH="8"/>
<FIELD ID="2" xsi:type="CharFixed" LENGTH="2"/>
<FIELD ID="3" xsi:type="CharFixed" LENGTH="68"/>
<FIELD ID="4" xsi:type="CharTerm" TERMINATOR="\r\n"
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="fieldname" xsi:type="SQLCHAR" />
<COLUMN SOURCE="2" NAME="fieldlength" xsi:type="SQLCHAR" />
<COLUMN SOURCE="3" NAME="fieldcomments" xsi:type="SQLCHAR" />
</ROW>
</BCPFORMAT>
然后您可以编写 PowerShell 脚本或 C# 应用程序来迭代目录中的文件(如上)并调用(假设您可以获得受信任的连接)
bcp <<yourdatabase>>.rawdata.rawfiles in \\path\to\data\file.ext
-f \\path\to\format\file.Xml -T
否则
bcp <<yourdatabase>>.rawdata.rawfiles in \\path\to\data\file.ext
-f \\path\to\format\file.Xml -U username -P password