我需要找到一种从文本文件创建表的方法,该文件包含我的表结构应该是什么样的字段定义(大约100或更多)。以下是包含大小和描述的字段名称示例:
da_ctat 1 progress status of a sample vc_acct 6 Assigned account qc_bact 6 billing account #1 lc_bac2 6 billing account #2 for a split ... ... zc_bar 12 z code pc_wav 1 wai oc_p1 1 ftp1 tc_df1 1 ftp2 kc_qq 1 ztp mc_split 1 split billing
以上是上述文字的含义
column 1-8 character is the field name column 9 space column 10-11 is the size of field name column 12 space column 13 - 80 is field comment
我需要创建一个存储过程或找到一些其他方法来创建一个包含上面显示的字段的表。例如, 字段名称da_ctat,长度为1个字符,描述“样本的进度状态”。表格中的下一个字段叫做vc_acct,长度为6个字符,描述了“已分配帐户”等...
由于我要创建超过100个字段,有没有办法编写存储过程来创建这个表结构,而不必手动创建表的字段?
感谢您的协助社区 尼克
答案 0 :(得分:3)
执行此操作的最直接方法可能是创建一个具有固定宽度平面文件作为数据源的SSIS包。我将你的目的地设置为与你的最终表格不同的东西(即使用“rawdata”模式或甚至是名为“rawdata”的单独数据库)。您可以使用此初始映射来创建包含建议数据类型的表(但您确实需要确保知道您的数据)。
<强> SSIS 强>
完成此操作后,您可以在SSIS中创建一个ForEach循环容器,该容器将遍历具有这些平面文件源和原始目标的特定文件夹。如果这是一次性的事情,您可以通过将SQL Server数据工具安装到当前的Visual Studio 2010安装(如果有的话)来执行此操作,或者安装程序将在VS 2010 Shell中安装SSDT(如果您没有) 。如果这不是一次性的,那么您将需要查看安装SSIS的许可,以便将其部署为可以安排定期运行的软件包。
如果失败了,您可以通过打开SSMS,右键单击目标数据库,单击任务,导入数据,选择平面文件源,固定宽度目标,映射源(您将要通过)来生成表模式创建这些列的痛苦,如果你真的有&gt; 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实例的连接,创建参数化插入命令并将数据插入变量中。
BULK INSERT
创建格式文件:
<?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
答案 1 :(得分:2)
这是一次性的努力,还是需要自动化的事情?
一次性,我会使用excel和很多连接。 100行真的没有多少手格式。
重复一遍,我会用你选择的脚本语言预处理这个文件,把它变成一个标准的SQL脚本。我的选择是PowerShell,因为它很容易与sql server集成。
定义文件似乎不完整,因为没有字段类型的指示。它们都是整体,浮标,varchar?