2014-12-02 101 views
0

我將數據從作爲鏈接服務器連接的cobol數據庫中提取到SQL Server。 我們已經結束了在我們的一個表中的不良數據,我試圖追查違規記錄。具體來說,我們有一封輸入到一年字段的字母,當SQL通過它將數據拉過來時,會嘗試將該列轉換爲數字數據類型。鏈接表中的數據不正確

我相信我需要的是將openquery和cast結合使用來選擇至少具有特定列的所有列作爲varchar,以便我可以檢索特定的違規記錄並擁有該部門。修復錯誤。

我試過以下兩種語法,但都產生錯誤。

select * from [incode]...ctvehl 
where VEH_YEAR like '992D' 

select * from openquery (incode, 'select cast(* as nvarchar) from ctvehl') 

爲清楚起見

linked server name = incode 
    table name = CTVEHL 
    Specific offending column = VEH_YEAR 

援助,這將不勝感激。

感謝

回答

0

你可能只是初步數據插入SQL Server中的一個工作表具有所有varchar()列。然後,您可以驗證並解析工作表以查找可能的錯誤,並將錯誤的行移動到其他處理/報告的「錯誤」表中。然後將其餘的行插入到實際的表中。

你應該看看SQL Server集成服務,它提供的方式來大衆進口數據和處理問題的行,請參閱:SQL Server Integration Services Dealing with Bad Data

+0

使用select into語句? – 2014-12-02 22:54:35

+0

我會使用類似'INSERT INTO local_WorkTable(col1,col2,col3)的東西SELECT col1,col2,col3 FROM openquery(incode,'select col1,col2,col3 from ctvehl')''。但是,您甚至可以嘗試通過使用INSERT INTO local_RealTable(col1,col2,col3)來跳過WorkTable SELECT col1,col2,cast(col3 as varchar(23))FROM openquery(incode,'select col1,col2,col3 from從ctvehl')'。 Openquery會將您的查詢傳遞給Cobol系統,該系統似乎無法處理'cast',這會使'cast'在SQL Server上本地運行。 – 2014-12-03 12:26:42

+0

確定與該代碼'創建表local_tempTable ( VEH_VEHICLE_CODE INT, VEH_YEAR VARCHAR(23) ) INSERT INTO local_TempTable(VEH_VEHICLE_CODE,VEH_YEAR)SELECT VEH_VEHICLE_CODE,澆鑄(VEH_YEAR爲varchar(23))FROM OPENQUERY(incode,'選擇VEH_VEHICLE_CODE,VEH_YEAR從ctvehl')我仍然看到這個錯誤OLE DB提供程序「MSDASQL」鏈接服務器「incode」返回消息「[TOD] [ODBC] [GENESIS] VISION:錯誤轉換字段VEH_YEAR字符串'992D'到數字」。 Msg 7330,Level 16,State 2,Line 6 無法從鏈接服務器「incode」的OLE DB提供程序「MSDASQL」中獲取一行。 – 2014-12-03 16:44:29