在 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 以获得所需的结果。
这是我正在处理的场景:
我正在处理从外部来源提供给我的数据。基本上发生的事情是数据库定义有一个类型为 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 以获得所需的结果。