如何将单列表分隔为具有多列的表?

时间:2011-09-16 09:00:20

标签: sql sql-server

我遇到了一个需要导入SQL Server 2005的文本文件。数据如下所示:

A1A00001
A2Name
A3Address
A4Credit
A5ModeOfPayment
D1Invoice 1 Amount
D1Invoice 2 Amount
D1Invoice N Amount (number of invoice varies per entry)
D2Total Amount   Amount
S1Total Outstanding Amount
S1
A1A00002
A2Name
A3Address
A4Credit
A5ModeOfPayment
D1Invoice 1 Amount
D1Invoice 2 Amount
D1Invoice N Amount (number of invoice varies per entry)
D2Total Amount   Amount
S1Total Outstanding Amount
S1
A1A00003
A2Name
A3Address
A4Credit
A5ModeOfPayment
D1Invoice 1 Amount
D1Invoice 2 Amount
D1Invoice N Amount (number of invoice varies per entry)
D2Total Amount   Amount
S1Total Outstanding Amount
S1

正如您所看到的,数据中没有分隔符,这就是为什么我只设法有一个包含上述信息的列的表。

我需要你的帮助,如何从A1到S1捕获一个条目,把它放到单独的列中,然后继续下一个出现的A1和S1,依此类推。

A1A00001 A2Name A3Address A4Credit A5ModeOfPayment D1Invoice 1 Amount D1Invoice ..等

提前致谢!

3 个答案:

答案 0 :(得分:2)

这是我将发送回提供商并告诉他们以适当格式发送的文件的典型示例。

不幸的是,这并不总是一种选择。在过去,我处理的方法是在一个列表中添加一个recordidentifer列,然后填充它以将所有记录保存在一起。我还会在插入记录时添加一个标识列,以便您可以订购。

然后使用游标或循环填充记录标识符,为每组相关记录添加相同的记录标识符。

现在创建您实际需要的规范化临时表。使用SQl代码填充它们(现在您可以使用recordidentifier)。然后从这些正规化的临时表中弹出您的真实表格。

答案 1 :(得分:0)

如果必须在sql中执行此操作,请使用cursor。但最好的方法是使用某些应用程序解析数据并将数据插入数据库。

使用cursor,它看起来像这样(伪代码):

If A1 insert previous row if exist

Start prepering next row

答案 2 :(得分:0)

如果这就像初始加载,并且您希望保留数据并可能添加/修改它,我会将其拆分为两个表。没有看到实际数据,这样的事情可能有用。 显然我只是编写了数据类型和列长度,并根据需要进行调整。

将A1到A5,D2和S1组合成一个表。实际上,D2Total Amount可能不会存储在表格中,而是从发票金额中获得。我把它作为例子包含在表格中。

CREATE TABLE baseInfo (
    A1 INT NOT NULL,
    Name VARCHAR(25) NOT NULL
    Address VARCHAR(55),
    Credit VARCHAR(12),
    ModeOfPayment VARCHAR(12)
    TotalAmount MONEY,
    OutstandingAmount MONEY
    CONSTRAINT [PK_basinfoA1] PRIMARY KEY CLUSTERED (A1)
)

对于D1,发票金额,只是一个两列表。 A1将与baseInfo中的帐户ID和发票金额相关联。

CREATE TABLE invoice (
    A1 INT NOT NULL,
    invoiceAmount MONEY
)
ALTER TABLE invoice WITH CHECK ADD CONSTRAINT FK_invoice_base FOREIGN KEY (A1) REFERENCES baseInfo (A1)

要将数据放入两个表中,您可以使用TSQL,但我个人会回到原始文本文件并使用Powershell来解析文本并构建SQL插入。