1

我需要找到一种方法来从包含我的表结构应该是什么样子的字段定义(大约 100 个或更多)的文本文件中创建一个表。以下是带有大小和描述的字段名称示例:

da_ctat 1 样本的进度状态
vc_acct 6 分配的帐户
qc_bact 6 计费帐户 #1
lc_bac2 6 计费帐户 #2 用于拆分
...
...
zc_bar 12 z 代码
pc_wav 1 wai
oc_p1 1 ftp1
tc_df1 1 ftp2
kc_qq 1 ztp
mc_split 1 拆分计费

这是上面文字的意思

第 1-8 列字符是字段名称
第 9 列空间
第 10-11 列是字段名称的大小
第 12 列空间
第 13 - 80 列是字段注释

我需要创建一个存储过程或找到其他方法来创建一个包含上面显示的字段的表。例如,1 个字符长的字段名称 da_ctat 和描述“样本的进度状态”。表中的下一个字段名为 vc_acct,长度为 6 个字符,描述“分配的帐户”等...a

由于我有超过一百个字段要创建,有没有办法编写一个存储过程来创建这个表结构,而我不必手动为表创建字段?

感谢您的协助社区尼克

4

2 回答 2

3

可能最直接的方法是创建一个具有固定宽度平面文件的 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 
于 2013-04-23T16:19:04.087 回答
2

这是一次性的工作,还是需要自动化的东西?

有一次,我会使用 excel 和大量的连接。100 行的手格式真的不多。

重复一遍,我会用你选择的脚本语言预处理这个文件,将它变成一个标准的 SQL 脚本。我的选择是 powershell,因为它很容易与 sql server 集成。

定义文件似乎不完整,因为没有指明字段类型。它们都是整数、浮点数、varchar 吗?

于 2013-04-23T15:33:31.230 回答