将固定宽度文本导入SQL

evg*_*ynn 1 sql

我们有这种格式的记录:

99 0882300 25 YATES ANTHONY V MAY 01 12 04 123456 12345678
Run Code Online (Sandbox Code Playgroud)

宽度是固定的,我们需要将其导入SQL.我们尝试了批量导入,但它不起作用,因为它不是','或'\ t'分开.它在文本文件中由不同长度的单个空格分隔,这是我们的困境所在.

有关如何处理这个的任何建议?谢谢!

val*_*e_p 7

问题很旧但可能仍然有用.

我和你有完全相同的问题.我的解决方案是使用BULK INSERT和FORMAT文件.

这将允许您:

  1. 保持代码更精简
  2. 将文本文件的映射文件上传到一个可以轻松调整的单独文件中
  3. 如果您喜欢,请跳过列

要切入追逐,这是我的数据格式(即一行)

608054000500SS001 ST00BP0000276AC024   19980530G10379    00048134501283404051N02912WAC 0024 04527N05580WAC 0024 1998062520011228E04ST 04856      -94.769323       26.954832     
-94.761114       26.953626G10379    183    1
Run Code Online (Sandbox Code Playgroud)

这是我的SQL代码:

BULK INSERT dbo.TARGET_TABLE
   FROM 'file_to_upload.dat' 
   WITH (
            BATCHSIZE = 2000,
            FIRSTROW = 1,
            DATAFILETYPE = 'char',
            ROWTERMINATOR = '\r\n',
            FORMATFILE = 'formatfile.Fmt'

        );
Run Code Online (Sandbox Code Playgroud)

请注意那里设置的ROWTERMINATOR参数和DATAFILETYPE.

这是格式文件

11.0
6
1   SQLCHAR 0   12  ""  1   WELL_API    SQL_Latin1_General_CP1_CI_AS
2   SQLCHAR 0   19  ""  2   SPACER1     SQL_Latin1_General_CP1_CI_AS
3   SQLCHAR 0   8   ""  3   FIELD_CODE  SQL_Latin1_General_CP1_CI_AS
4   SQLCHAR 0   95  ""  4   SPACER2     SQL_Latin1_General_CP1_CI_AS
5   SQLCHAR 0   5   ""  5   WATER_DEPTH SQL_Latin1_General_CP1_CI_AS
6   SQLCHAR 0   93  ""  6   SPACER3     SQL_Latin1_General_CP1_CI_AS
Run Code Online (Sandbox Code Playgroud)

我在下面放了文档链接,但你必须注意以下几点:

  1. 第5列中的"",表示分隔符(对于.csv显然是","),在我们的例子中设置为"";
  2. 第2列完全是"SQLCHAR",因为它是一个文本文件.即使数据表中的目标字段是例如整数(这是我的情况),这必须保持不变

额外注意:在我的情况下我只需要三个字段,所以中间的东西我只是称为"spacer",在我的格式文件中被忽略(你在第6列中更改数字,请参阅文档).

希望它能满足您的需求,对我来说很好.干杯

文档:https : //msdn.microsoft.com/en-us/library/ms178129.aspx https://msdn.microsoft.com/en-us/library/ms187908.aspx

  • 我衷心同意@Gaspa79。干杯,vale_p,你刚刚救了我的培根。:) (2认同)

小智 6

当您感觉更喜欢使用SQL而不是导入工具时,您可以将文件批量导入到临时表中的单个VARCHAR(255)列中.然后使用SQL处理所有记录并将它们转换为目标表:

CREATE TABLE #DaTable(MyString VARCHAR(255)) 
INSERT INTO #DaTable(MyString) VALUES ('99 0882300 25 YATES ANTHONY V MAY 01 12 04 123456 12345678')

INSERT INTO FInalTable(Col1, Col2, Col3, Name)
SELECT CAST(SUBSTRINg(MyString, 1, 3) AS INT) as Col1,
    CAST(SUBSTRING(MyString, 4, 7) AS INT) as Col2,
    CAST(SUBSTRING(MyString, 12, 3) AS INT) as Col3,
    SUBSTRING(MyString, 15, 6) as Name
FROM #DaTable

result: 99  882300  25  YATES 
Run Code Online (Sandbox Code Playgroud)