日期:2014-05-18  浏览次数:20411 次

同志们,请教一个存储过程的问题。THX!
CREATE   PROCEDURE   sp_ImportData_30
(
@table VARCHAR(40),   /*表名*/  
@keyfield VARCHAR(100),/*主键字段名,多个主键时按 '; '分割*/
@srcsql VARCHAR(400)   /*从源表检索数据的语句,如果该语句中包含 " ' "单引号要用两个单引号表示*/
)
/*根据条件导入数据*/
AS
DECLARE   @sql   VARCHAR(2000)
DECLARE   @rtnError   INT
DECLARE   @updateDybz   VARCHAR(1000)

SET   @rtnError   =   0
/*从数据源中取出数据,并插入目的表中没有的记录*/
SET   @sql   =   'INSERT   INTO   '+@table+   '   SELECT   *   FROM   OPENROWSET( ' 'SQLOLEDB ' ', ' '172.16.99.136 ' '; ' 'sa ' '; ' 'sybasepb ' ', ' ' '   +   @srcsql

SET   @sql   =   @sql   +   ' ' '   )   AS   SOURCE     WHERE   NOT   EXISTS   (SELECT   1   FROM   '   +   @table   +   '   WHERE     1=1   '

/*取出多个主键,构造SQL语句*/
SET   @keyfield   =   LTRIM(RTRIM(@keyfield))
WHILE(CHARINDEX( '; ',@keyfield)   >   0)
BEGIN
SET   @sql   =   @sql   +   '   AND   '   +   @table   +   '. '   +   SUBSTRING(@keyfield,   1,CHARINDEX( '; ',@keyfield)-1)   +   '   =   '   +     'SOURCE. '+SUBSTRING(@keyfield,   1,CHARINDEX( '; ',@keyfield)-1)  
SET   @keyfield   =   STUFF(@keyfield,   1,   CHARINDEX( '; ',@keyfield),   ' ')
END
SET   @sql   =@sql   +     '   AND   '   +   @table   +   '. '   +@keyfield   +     '   =   '   +     'SOURCE. '+@keyfield   +   ') '

EXEC   (@sql)
IF(   @@ERROR <>   0)
SET   @rtnError   =   @@ERROR

--IF(@table   =   'L_PATIENTINFO ')/*更新样本打印标志*/
--BEGIN
--SET   @updateDybz   =     REPLACE   (@srcsql   ,SUBSTRING(@srcsql,   0,   CHARINDEX( 'WHERE ',   @srcsql))   ,   'UPDATE   L_PATIENTINFO   SET   RESULTSTATUS=4   '   )
--EXEC(@updateDybz)
--END
--PRINT(@sql)
--PRINT(@rtnError)
RETURN   @rtnError
GO

执行过程错误:
EXEC   sp_ImportData_30   'L_SAMPLETYPE ',   'SAMPLETYPE ', 'SELECT   *   FROM   lis.dbo.L_SAMPLETYPE '  

服务器:   消息   446,级别   16,状态   9,行   1
无法解决   equal   to   操作的排序规则冲突。

另外一个就没问题:
EXEC   sp_ImportData_30   'GY_KSDM ',   'KSDM ',   'SELECT   *   FROM   lis.dbo.GY_KSDM '



------解决方案--------------------
up
------解决方案--------------------
服务器: 消息 446,级别 16,状态 9,行 1
无法解决 equal to 操作的排序规则冲突。

==============================================

报这个错,主要是因为在Where条件中做比较的时候,两个表中要比较的字段的Collation不一致!
可以参照BOL上的Collate上的说法,为这些字段指定排序规则!
SELECT * FROM a ,b
WHERE a.cola = b.colb COLLATE [collation name]
------解决方案--------------------
UP 楼上的.
------解决方案--