Sql-Server

在 openrowset 批量插入中指定分隔符

  • April 2, 2019

我正在嘗試使用游標將數據從 CSV 文件插入到表中並打開行集批量插入。這在 99% 的情況下都適用於我,但如果 csv 文件中的某個欄位包含逗號 (, ),則數據導入將被破壞,並且所有列都會在其位置後導入一列。例如,它應該如下所示:

timestamp   username   name         IP       title
20190331    ABCD12G    david hertz  1.1.1.1   null

但是,如果我在名稱列中有逗號(例如),它將如下所示:

timestamp   username   name      IP      title
20190331    ABCD12G    david    hertz   1.1.1.1

csv 範例:

username,name,ip,title
ABCD12G,david,hertz,1.1.1.1,''

這是我正在使用的語法:

insert into [player table]
select 20190331,* FROM  OPENROWSET(BULK  'D:\folder\2019\03-
31\Player_statistics.csv', FIRSTROW = 2, 
FORMATFILE='D:\folder\test\xml\Player_statistics.xml')
as t1

我該如何更改它以忽略單詞中間的逗號?(我無法限制 CSV,因為它取自另一個不會限製字元的客戶端。

我用於通過 openrowset 導入的 xml:

xml

當您執行正常批量插入時,您可以選擇指定分隔符 fielterminator = ‘","’ ,我在 openrowset 中找不到類似的東西。

什麼可以幫助解決這個問題?

但如果 csv 文件中的某個欄位包含逗號 ( , )

如果所有行都包含逗號,則解決方案可以是

<ROW>  
 <COLUMN SOURCE="1" NAME="username" xsi:type="SQLSMALLINT"/>  
 <COLUMN SOURCE="2" NAME="name1" xsi:type="SQLNVARCHAR"/>  
 <COLUMN SOURCE="3" NAME="name2" xsi:type="SQLNVARCHAR"/>  
 <COLUMN SOURCE="4" NAME="IP" xsi:type="SQLNVARCHAR"/>  
 <COLUMN SOURCE="5" NAME="title" xsi:type="SQLNVARCHAR"/>  
</ROW> 
INSERT INTO [player table]
SELECT 20190331, 
      username, 
      name1+','+name2, 
      IP, 
      title 
FROM  OPENROWSET( BULK 'D:\folder\2019\03-31\Player_statistics.csv', 
                 FIRSTROW = 2, 
                 FORMATFILE='D:\folder\test\xml\Player_statistics.xml') t1

如果只有一些行包含逗號,並且沒有一個title為空/空,則嘗試

INSERT INTO [player table]
SELECT 20190331, 
      `username`, 
      CASE WHEN title IS NULL 
           THEN name1
           ELSE name1+','+name2 END, 
      CASE WHEN title IS NULL 
           THEN name2
           ELSE IP END, 
      CASE WHEN title IS NULL 
           THEN IP
           ELSE title END
      IP, 
      title 
FROM  OPENROWSET( BULK 'D:\folder\2019\03-31\Player_statistics.csv', 
                 FIRSTROW = 2, 
                 FORMATFILE='D:\folder\test\xml\Player_statistics.xml') t1

如果 sometitle為空/空,我找不到簡單的區分方法。

更新

解決方案可以是:僅將 CSV 劃分為兩個欄位 -username整個 slack,然後可以使用導入查詢的 SELECT 部分中的常用字元串函式將 slack 劃分為單獨的欄位(可能在鏈計算中使用中間變數)。

引用自:https://dba.stackexchange.com/questions/233728