2014年7月11日 星期五

sql server openrowset 匯入文字檔之怪問題..(已解決)

還到一個無解的怪問題

schema.ini 內容如下
[test.txt]
ColNameHeader=False
Format=Delimited(;) 


test.txt資料內容如下
test;1234;3FDS
test;1234;6F8S


查詢SQL如下
SELECT *   FROM OPENROWSET(  'Microsoft.ACE.OLEDB.12.0','Text;Database=C:\TEMP\;',
 'SELECT * FROM test.txt' )


回傳結果如下
F1    F2    F3    F4
test    1234    NULL
test    1234    68.00

F4一欄的值都不對了。

參考 KB說明,在schema.ini加了MaxScanRows=0設定,就正常了

F1    F2    F3
test    1234    3FDS
test    1234    6F8S


巴特....把test.txt資料內容改成如下
test;1234;6F8S
test;1234;3FDS

結果卻又不正確了

F1    F2    F3
test    1234    68.00
test    1234    NULL



?F?S 到底隱藏著什麼密碼學呢?? 只要他放在第一行不管哪一欄就亂套了.....
這是什麼情形啊....無解 


2014/07/17 更新
 因為讀檔時,這個欄位變成數值型態的機率有點高,後來用了一個撇步去克服。

就是先建一個暫存檔,例temp.txt,里頭只放一筆全部都是字串態的資料行,例
XXXX;XXXX;XXXX

然後在OPENQUERY讀取前,利用xp_cmdshell 先把這個檔利用copy指令與暫存檔合併在一起

copy /b /y temp.txt+test.txt test_new.txt

schema.ini 內容加入MaxScanRows=1,強迫以第一行的型態來設定欄位型態
[test.txt]
ColNameHeader=False
Format=Delimited(;)

MaxScanRows=1
 
再讀取後排除第一筆暫存資料列,就可以正常寫入檔案內容了
SELECT *   FROM OPENROWSET(  'Microsoft.ACE.OLEDB.12.0','Text;Database=C:\TEMP\;',
 'SELECT * FROM test_new.txt' ) WHERE F1 <> 'XXXX'

publish error allowDefinition='MachineToApplication'

一個老舊的aspx web form專案,調了一些功能建置成功,但進行部署時顯示以下錯誤。 在應用程式層級之外使用註冊為 allowDefinition='MachineToApplication' 的區段發生錯誤。錯誤的原因可能是虛擬目錄尚未在 IIS 中設定為...