[英].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 OPENROWSET
在SQL
上傳它。 但問題是缺少州名的記錄,我想復制最初聲明的州名。
例如,在上面的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.