Sql-Server
在 openrowset 批量插入中指定分隔符
我正在嘗試使用游標將數據從 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:
當您執行正常批量插入時,您可以選擇指定分隔符 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
如果 some
title
為空/空,我找不到簡單的區分方法。更新
解決方案可以是:僅將 CSV 劃分為兩個欄位 -
username
整個 slack,然後可以使用導入查詢的 SELECT 部分中的常用字元串函式將 slack 劃分為單獨的欄位(可能在鏈計算中使用中間變數)。