CREATE TABLE Test(id int identity(1,1))with ADOQuery do
begin
  Close;
  SQL.Text = 'select * from Test';
  Open;
  ShowMessage(Fields[0].ClassName); //输出 TAutoIncField  Close;
  SQL.Text = 'select * from (select * From Test) as a';
  Open;
  ShowMessage(Fields[0].ClassName); 
  //这儿要注意:
  // SQL SERVER 2000下输出 TAutoIncField
  // SQL SERVER 2005下输出 TIntegerField!
end;
步步陷阱,如果大家有哪些其他要注意的地方也可以写出来。

解决方案 »

  1.   

    select * from test是从表直接获取数据,select * from (select * from test) a则是从子查询中获取数据,两个取出来的数据类型不同,可以理解啊。
      

  2.   

    对,问题是SQL SERVER2000下,取出来的id字段是 TAutoInc类型的
    SQL SERVER2005下,取出来的id字段就变成 TInteger类型了
      

  3.   

    SQL2005是后出来的东西,估计Delphi对他的支持还不怎么样啊。
      

  4.   

    要是像oracle那样没有这个东西给你提供一个序列的概念就不会有这个问题了
      

  5.   

    这么多星星出来吓人啊
    通过在D7和D10中试验得出一个参考结论:  在D7和D10中都提示为TAutoIncField。  条件:
      SQL2005为在原来2000未卸载干净的情况下安装的,所以保留了2000的一些机制。不知道在纯2005下面是否会出现楼主所说的情况。
      
      如果在纯2005环境下出现楼主所说的情况,我猜想,是否是因为2005改变了一些东西,而Delphi在调用的时候就无法获取这些被改变的信息,导致字段类型在楼主所说的情况下转换成接近的类型被显示出来。
      呵呵,小生愚见,如有错误的地方,望各位星星不吝赐教!
      

  6.   

    这个应该是字段属性连带的问题,个人认识对于这种情况下,sql2k的做法是有欠妥当的,这个自动编号只是相对test表,而不是别名为a的子查询。
    其实从SQL2k SP4开始就有好些与之前所不同,相关的应该在MSSQL版当中可以查到。SP4之后有对部分查询进行了优化,从而使得与之前的版本有相当大的结果差,也正因为如此,即便是SP4有了相当的性能提升也仍然,还有很多人不愿意更新。因为有些已经使人形成了一种习惯,甚至可以说是一种便利。更新之后,不仅得不到这种便利,稍欠清楚一点就有可能写出的东西事与愿违。
      

  7.   

    对于视图, SQL2000也能准确表现自增字段, SQL2005就不行.
    用起来好不习惯.