Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在ms sql server大容量插入期间向数据添加十进制数_Sql Server_Csv_Formatting_Decimal Point - Fatal编程技术网

Sql server 在ms sql server大容量插入期间向数据添加十进制数

Sql server 在ms sql server大容量插入期间向数据添加十进制数,sql-server,csv,formatting,decimal-point,Sql Server,Csv,Formatting,Decimal Point,下面是我正在处理的场景: 我正在处理从外部来源提供给我的数据。基本上,数据库定义有一个numeric(9,3)类型的列 已提供csv文件,对于上面指定的列,所有数据的形式如下: 000100000 000001000 000002000 001000000 所以本质上发生的事情是,我自己插入小数点,以便将这些值转换为 000100.000 000001.000 000002.000 001000.000 我自己在c#中使用基本的文本文件操作将所有小数添加到值中。有没有办法告诉sql serv

下面是我正在处理的场景:

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

已提供csv文件,对于上面指定的列,所有数据的形式如下:

000100000
000001000
000002000
001000000
所以本质上发生的事情是,我自己插入小数点,以便将这些值转换为

000100.000
000001.000
000002.000
001000.000

我自己在c#中使用基本的文本文件操作将所有小数添加到值中。有没有办法告诉sql server在大容量插入操作期间默认情况下在第三个位置插入一个小数点?

在这种情况下,您需要使用临时表,将数据以原始形式加载到表中,然后将其移动到目标表中,并将每行的值除以1000。当然,如果你有不同的格式,比如4位数字,那么你可以除以10000,以此类推。

我知道这是一篇较老的文章,但我在试图解决完全相同的问题时遇到了它。我想出了一个一步完成的方法,避免了登台,所以我想和大家分享一下

您可以使用
OPENROWSET
,而不是使用
BULK INSERT
命令,并提供列别名,然后在select中使用

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


...
...
...
...
请注意,我们将字段定义为
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**,...)

请注意,我们为每个列指定了列别名。现在,在将插入到具有数字或十进制列的表中的select中,您可以使用别名并对其应用其他逻辑,例如除以1000以获得所需的结果。

您可以在SSIS中执行此操作,正如我几天前指出的:不是在大容量插入期间,不是。您可以在后续命令中执行此操作。