Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 拆分一个包含一些双引号的VARCHAR字段_Sql_Sql Server 2008_Csv - Fatal编程技术网

Sql 拆分一个包含一些双引号的VARCHAR字段

Sql 拆分一个包含一些双引号的VARCHAR字段,sql,sql-server-2008,csv,Sql,Sql Server 2008,Csv,我正在使用一个存储过程将一个大型csv文件大容量插入到一个表中,所有这些文件都集中在一个设置为varchar8000的字段中。我不得不这样做,因为有些数据用引号括起来,有些则没有。在SQL Server 2008中,要用作批量导入的数据文件,CSV文件必须符合以下限制: 数据字段从不包含字段终止符。 数据字段中的任何值或所有值都用引号括起来。 因此,我的数据如下: Field1 "data", "data2", "data3", "data4", 123, 567, 354, 5,64,4565

我正在使用一个存储过程将一个大型csv文件大容量插入到一个表中,所有这些文件都集中在一个设置为varchar8000的字段中。我不得不这样做,因为有些数据用引号括起来,有些则没有。在SQL Server 2008中,要用作批量导入的数据文件,CSV文件必须符合以下限制:

数据字段从不包含字段终止符。 数据字段中的任何值或所有值都用引号括起来。 因此,我的数据如下:

Field1
"data", "data2", "data3", "data4", 123, 567, 354, 5,64,4565,54
它现在在SQL Server中处于一种诱人的状态。我现在如何清理数据并插入到一个表中,如下所示:我已经用正确的标题设置了这个新表

Field1 
data

Field2
data 2

Field 3
data 3 
等等


最终,这一切都需要在存储过程中执行,因为它需要在reporting services中执行。我一直在研究函数,但是当某些字段没有双引号时,如何使其工作?逗号够了吗?XML函数也是最好的吗?

我采用以下方法导入数据:

将表插入所有列均为字符串的暂存表中。 将表从那里复制到具有所需列类型和结构的适当表中。 在您的情况下,代码的第二部分是:

insert into FinalTable(col1, . . . )
    select (case when left(col1, 1) = '"' then replace(col1, '"', '')
                 else col1
            end),
           (case when isnumeric(col2) = 1 then cast(col2 as float)
            end),
           . . .
    from StagingTable

毫无疑问,SSIS或使用格式文件中都有解决方案。我更喜欢使用暂存表方法,因为我发现使用暂存表调试数据库中的数据问题更容易。

您使用的是什么数据库?或者您可以在导入csv文件之前预处理csv文件并删除双引号?例如,使用SED或一个小型C程序应该很容易做到。谢谢Gordon,我会看一看。JPW-不幸的是,预处理csv文件不是一个选项。嘿,我收到了以下错误:INSERT语句的select列表包含的项目少于INSERT列表。SELECT值的数量必须与INSERT列的数量匹配。暂存表只有一个名为字段1的字段-它如何知道在每个逗号之后,它需要进入最终表中的一个新字段?这是我的代码:insert into field_TABLE1,col2,col3…..col20选择大小写,当leftField1,1=''然后替换Field1',否则Field1结束,当isnumericField1=1时,则将Field1从Temp转换为float end_Table@user2470603 . . . 如果在insert语句中放入20列,则select语句中需要20列。没有了。同样如此。如果您想要两列,那么只需将这两列放在插入的列列表中即可。