2014-12-02 43 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