在 ms-sql 服务器批量插入期间向数据添加小数

Adding Decimal to data during ms-sql server bulk insert

这是我正在处理的场景:

我正在处理从外部来源提供给我的数据。基本上发生的事情是数据库定义有一个类型为 numeric(9,3)

的列

已提供一个 csv 文件,对于上面指定的列,所有数据均采用以下形式:

000100000
000001000
000002000
001000000

所以基本上发生的事情是我自己插入小数点以便将这些值转换为

000100.000
000001.000
000002.000
001000.000

我一直在使用基本的文本文件操作在 C# 中将所有小数添加到值中。有没有办法告诉 sql 服务器在批量插入操作期间默认在第三个位置插入小数点?

在这种情况下,您可能希望使用暂存 table,以原始形式将数据加载到 table,然后将其移动到目标 table 并将每一行的值除以 1000 .当然如果你有不同的格式,比如4位,那么你除以10000等等。

我知道这是一个较旧的 post,但我在尝试解决完全相同的问题时遇到了它。我想出了一种一步完成此操作并避免分期的方法 table 所以我想我会分享。

您可以使用 OPENROWSET 而不是使用 BULK INSERT 命令,并提供您随后可以在 select.

中使用的列别名

首先您需要一个格式文件来定义您的列:

<?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="2" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="12"/>
        ...
    </RECORD>
    <ROW>
        ...
        <COLUMN SOURCE="2" NAME="my_numeric_field" xsi:type="SQLINT"/>
        ...
    </ROW>
</BCPFORMAT>

请注意,我们将字段定义为 INT。然后你可以使用 OPENROWSET 来读取你的文件的内容:

INSERT INTO dbo.my_table
SELECT 
    ...,
    **my_numeric_field/1000**,
    ...
FROM OPENROWSET(
    BULK 'C:\my_file.txt',
    FORMATFILE = 'C:\FormatFiles\my_format_file.fmt'
) AS e (...,**my_numeric_field**,...)

请注意,我们为每一列分配了列别名。现在,在将使用数字或小数列插入我们的 table 中的 select 中,您可以使用您的别名并对其应用其他逻辑,例如除以 1000 以获得所需的结果。