我用存储过程将一个ADOQuery执行得到的Data赋予了ClientDataSet 的Detail,在初始化的时候,这个结果集中是没值的,然后我在执行了一个查询事件后得到一个临时的ClientDataSet,两个语句是相同的.但是一个有数据,一个没有数据,这个时候,我就把有数据的向没有数据的里面插,但是要抱错误, 说里面有一个列不能被修改.查询语句类似于SELECT *, CI_Name=(SELECT CI_NAME FROM 表A WHERE 表A.ID=表B.ID)
FROM 表B然后插入语句是
CDS1.APPEND;
CDS1.FieldByName('CI_Name').AsString = CDS2.FieldByName('CI_Name').AsString我以前用过这些的存储过程,都可以添加,但是这次就不行不晓得为什么!CREATE PROCEDURE T1
  @ID
AS
BEIGN
DECLARE @M int   IF (SELECT * FROM 表A WHERE ID=@ID)
      SELECT @M = 数字列 FROM 表A   IF @M>50 
     SELECT TOP 1 REVALUE=@M FROM Sysobjects   IF RTRIM(LTRIM(@ID))= 0 
     SELECT REVALUE=CAST(NULL AS INT) FROM sysobjects
END
GO我以前用这个类似的存储过程是成功执行了我想得到的结果,但是这次使用了级
联SQL语句以后,就要出现级联的字段不能修改的问题,请知道的同志给予赐教!
谢谢了

解决方案 »

  1.   

    SELECT *, CI_Name=(SELECT CI_NAME FROM 表A WHERE 表A.ID=表B.ID)
    FROM 表BCI_name是一个表达式当然不能修改
      

  2.   

    这样是不能修改的要用 CDS1:=TCliendDataSet.Creare(nil);
         with CDS1do
         begin
             FieldDefs.Add('Field1',ftString,100);
         end;
         CDS1.CreateDataSet;
         CDS1.APPEND;
         CDS1.FieldByName('CI_Name').AsString = CDS2.FieldByName('CI_Name').AsString
      

  3.   

    SELECT *, CI_Name=(SELECT CI_NAME FROM 表A WHERE 表A.ID=表B.ID)
    FROM 表B看来你的ci_name并不是表B的字段,既然你要更新的这个字段你应该操作表A才是,逻辑混乱了,楼主静下心来整理一下思路吧
      

  4.   

    但是,很奇怪的是,我

    存储过程拼凑过一个语句
    比如得的变量@v1,@v2,@v3,@v4有查询值的时候
    SELECT TOP 1 V1=@V1,V2=@V2,V3=@V3,V4=@V4 FROM SYSOBJECTS无查询值的时候
    SELECT TOP1 V1=CAST(NULL AS VARCHAR), V2=CAST(NULL AS VARCHAR), V3=CAST(NULL AS VARCHAR), V4=CAST(NULL AS INT) FROM SYSOBJECTS WHERE 1<>1我用这样的存储过程完成过两个ClientDataSet的转换,可是为什么到这里却不行呢?要不我把语句改成这样的语句来试一试
    SELECT * FROM (SELECT TOP 1 V1=@V1,V2=@V2,V3=@V3,V4=@V4 FROM SYSOBJECTS) A
      

  5.   

    问题解决,就是采用了最后一个办法,同时使用了临时表SELECT * INTO # FROM (SELECT TOP 1 V1=@V1,V2=@V2,V3=@V3,V4=@V4 FROM SYSOBJECTS) A
    DROP TABE #这样把ClientDataSet骗了过去,然后更新的时候我只要动态的把ClientDataSet生成一个sql语句就解决了! :)