【问题标题】:Removing double quotes before bulk insert在批量插入之前删除双引号
【发布时间】:2018-02-22 00:54:24
【问题描述】:

我正在尝试使用批量插入加载文件,但由于某些数据被引号覆盖,数据未正确插入。

我尝试使用格式文件,但它不起作用,因为该列中并非所有行都包含引号。只有一些人这样做。例如

columna
abc
cdf
"dfd"
dfs
"aee"

所以我的格式文件不起作用。

我的批量插入代码:

bulk insert tablename
from 'C:/...'
 with 
(
    FIRSTROW = 2,  
    rowterminator = '0x0a' 
    ,formatfile = 'file.fmt'
     )

格式化文件:

10.0
5
1       SQLCHAR             0       1000      ","       1      "a"                           ""
2       SQLCHAR             0       1000      ",\""       2     "b"                 ""
3       SQLCHAR             0       1000      "\",\""       3      "d" <- has quotes  ""                              
4       SQLCHAR             0       1000      ",\""     4      "e"                          ""
5       SQLCHAR             0       1000      "\n"   5      "f"            

有什么想法吗?

【问题讨论】:

  • 如何批量插入?
  • @maSTAShuFu 编辑了帖子。
  • 你的格式文件是什么样的?
  • 如果批量插入工作正常,接受双引号..你可以做的是一些家务......使用replace函数更新列数据
  • @maSTAShuFu 我不能这样做,因为该列被分成 2 列,因为某些数据可能包含逗号。

标签: sql-server csv bulkinsert


【解决方案1】:

如果没有其他方法可以删除列中的双引号,那么您可以做一个后期处理,用replace 更新受影响的列

即。

update mytable set col1 = replace(col1,'"',''),col2 = replace(col2,'"','')

【讨论】:

    【解决方案2】:

    我在一些数据中遇到了这个问题,这些数据在数据中也有一些引号,所以我不能使用替换。以防万一:

    CREATE TABLE SomeTable
    (
    ColumnA VARCHAR(5)
    )
    INSERT INTO SomeTable VALUES  ('abc')
    INSERT INTO SomeTable VALUES  ('cdf')
    INSERT INTO SomeTable VALUES  ('"dfd"')
    INSERT INTO SomeTable VALUES  ('dfs')
    INSERT INTO SomeTable VALUES  ('"aee"')
    INSERT INTO SomeTable VALUES  (' efg ')
    GO
    
    SELECT * FROM SomeTable
    GO
    
    --TRIM THE DATA
    
    UPDATE SomeTable SET ColumnA =LTRIM(RTRIM(ColumnA))
    GO
    
    --DELETE THE DELIMITERS
    
    UPDATE SomeTable SET ColumnA = LEFT(ColumnA,LEN(ColumnA)-1) WHERE RIGHT(ColumnA,1) LIKE '"'
    GO
    UPDATE SomeTable SET ColumnA = RIGHT(ColumnA,LEN(ColumnA)-1) WHERE LEFT(ColumnA,1) LIKE '"'
    GO
    
    --RETRIM THE DATA
    
    UPDATE SomeTable SET ColumnA =LTRIM(RTRIM(ColumnA))
    GO
    
    SELECT * FROM SomeTable
    GO
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 2011-04-30
      • 2018-12-15
      • 1970-01-01
      相关资源
      最近更新 更多