TLDR版本: 批量插入會告訴你它影響了多少行。它不會告訴你試圖影響多少行,或者多少行失敗。這個問題很明顯,我想知道是否有更可靠的文本文件上傳方式,將代碼保存在服務器中。SQL Server 2008:是否有更好的(服務器端)替換大容量插入?
完整版本:我有一個應用程序需要定期將文本數據文件上傳到SQL Server表中。由於一些瘋狂和瘋狂的原因,我想把它放在一個存儲過程中,使它成爲抽象層的一部分,而不是讓前端應用程序直接寫入表中。
與大多數SQL服務器腳本我花了我平時的時間份額撲我的頭撞牆得到它在所有的工作。 (與本網站和其他搜索過去的職位不小的幫助。)
威爾批量插入讀標題行,以確定哪些字段寫?不,不得不使用格式文件(並希望表結構/順序不會改變),或者使用僅包含數據文件中的列的登臺表。臨時表在將數據複製到實際表之前接收數據。
如果您在目標表中忽略單列(即使是具有默認值的列)並且不使用格式文件,該怎麼辦?你會得到這樣的自我解釋錯誤信息「無法從OLE DB提供程序獲取一行」BULK「鏈接服務器」(null)「。」使用前面提到的登臺表,省略任何不在數據源中的列,可以解決這個問題。
這很好,我可以忍受這一點。這不是可怕的部分。這是。
如果臨時表中仍然有被定義爲NOT NULL任何字段,但一個數據源行是空該列,你不會得到一個錯誤。根據我的測試,如果你有(說)5行數據,第3行缺少NOT NULL字段中的數據,那麼你不會得到一個錯誤,但會得到消息「4行更新」。如果您需要5行並對受影響的行數進行交叉檢查,以確保預期的編號存在,但這些文件的長度各不相同,並且Bulk Insert不會告訴您它實際上讀了多少行。更糟糕的是,在某些情況下,一行中缺少的字段也會阻止上傳以下(有效)行。
顯而易見的解決方案?從登臺表中刪除NOT NULL約束,並處理登臺表和真實表之間的接口中的任何空例外。但是......我擔心的是,這件作品可能會在我還沒有遇到的其他情況下做同樣的事情。也就是說,讀一行,沒有將它寫入登臺表,並且不會拋出異常,這樣沒有人知道數據丟失,直到他們去查找並發現它不在那裏。即使Access有更好的文本導入選項。
我的問題,那麼,是...有沒有處理的變量行長度的文本文件上傳到SQL Server,而不必依賴於前端應用程序做一個更好的(更可靠)的方式?
在此先感謝您的任何建議。
那麼,你正在嘗試做一個'BULK INSERT',它不應該讓你感到驚訝,因爲你沒有太多的控制它的方式。如果你想要更多的控制(例如使用SSIS中的數據流任務),你將會獲得性能上的提升,這真的取決於你 – Lamak
這不是一個問題。這完全是一個「它有時不會這麼做的問題,更重要的是它不會告訴你它沒有這樣做」。 –