簡體   English   中英

使用 sql bulkload 或 openrowset 導入 .csv 文件以獲取缺失的列數據

[英].csv file import using sql bulkload or openrowset for missing column data

.我有一個csv文件。 數據如下,

___________________________________________________________
StateName       |  City                 |  Score1 |  Score2 |
________________|_______________________|_________|_________|
                |                       |         |         |
New South Wales |  Albury (C)           |  979    |   967   |  
                |  Armidale Dumaresq (A)|  987    |   985   |  
                |  Ashfield (A)         |  1015   |   1031  |
________________|_______________________|_________|_________| 
Victoria        |  Alpine (S)           |   987   |   970   |
                |  Ararat (RC)          |   951   |   938   |
________________|_______________________|_________|_________|

現在,我想通過BCP or OPENROWSETSQL上傳它。 但問題是缺少州名的記錄,我想復制最初聲明的州名。

例如,在上面的row# 2 我希望StateName"Armidale Dumaresq (A)"市的"Armidale Dumaresq (A)" "New South Wales" "Armidale Dumaresq (A)" 我如何使用sql bulk load來做到這一點? 我真的不想只為這個小東西創建一個新的應用程序。 任何解決方案將不勝感激。

假設您的 csv 文件保存為E:\\Temp\\Test.csv

StateName,City,Score1,Score2
New South Wales,Albury (C),979,967
,Armidale Dumaresq (A),987,985
,Ashfield (A),1015,1031
Victoria,Alpine (S),987,970
,Ararat (RC),951,938

您可以在E:\\Temp\\Test.xml編寫BCP 格式文件,如下所示:

<?xml version="1.0"?> 
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
 <RECORD> 
  <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="200"/> 
  <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="200"/> 
  <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="8"/> 
  <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="8"/> 
 </RECORD> 
 <ROW> 
  <COLUMN SOURCE="1" NAME="StateName" xsi:type="SQLNVARCHAR"/> 
  <COLUMN SOURCE="2" NAME="City" xsi:type="SQLNVARCHAR"/> 
  <COLUMN SOURCE="3" NAME="Score1" xsi:type="SQLINT"/> 
  <COLUMN SOURCE="4" NAME="Score2" xsi:type="SQLINT"/> 
 </ROW> 
</BCPFORMAT>

並使用查詢:

WITH Src AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) N, * 
    FROM OPENROWSET(BULK N'E:\Temp\Test.csv', FORMATFILE = 'E:\Temp\Test.xml', FIRSTROW = 2) As Blk
), NameGroup AS
(
    SELECT *, COUNT(StateName) OVER(ORDER BY N ROWS UNBOUNDED PRECEDING) GroupName FROM Src
)
SELECT FIRST_VALUE(StateName) OVER (PARTITION BY GroupName ORDER BY N ROWS UNBOUNDED PRECEDING) StateName, City, Score1, Score2
FROM NameGroup

結果

StateName         City                    Score1   Score2
----------------- ----------------------- -------- ------
New South Wales   Albury (C)              979      967
New South Wales   Armidale Dumaresq (A)   987      985
New South Wales   Ashfield (A)            1015     1031
Victoria          Alpine (S)              987      970
Victoria          Ararat (RC)             951      938

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM