SQL SERVER 2005中:CREATE PROCEDURE [dbo].[P_TEST]  
   @an_id float(53) 
AS 
   BEGIN
       SELECT @an_id RETURN;   END说明一下:TEST表中id 的类型是numeric(18,0),是主键。
在执行时:
EXEC P_TEST 1234567890123;
执行的结果@an_id会变成科学计数法,搞得后面的SQL肯定是取不到值了。我试了用cast,convert,但是发现值会变掉,这样也不行,我现在把@an_id参数设成varchar了。
有没有什么办法解决不让他变为科学计数的方法。

解决方案 »

  1.   

    CREATE   PROCEDURE   [dbo].[P_TEST]     
          @an_id   float(53)   
    AS   
          BEGIN 
                  SELECT   @an_id   
          END 
    goexec P_test 9234567890123249
    drop  proc p_test
    ----------------------------------------------------- 
    9234567890123248.0(所影响的行数为 1 行)
      

  2.   

    科学计数法只是显示的问题问题的根源在于 float 类型本身是一种不精确的数据表示方法, 也就是说, 你放一个数据进去, 拿出来的时候可能会存在一点点点误差, 而这点点点误差在做数据比较的时候就会导致数据不一致, 从而查不到数据
    既然你的数据只是 numeric(18,0), 参数就不要用 float, 也用 numeric(18, 0) 就好了.
      

  3.   

    是这样呀,邹大师一语道破了。
    其实存储过程是从oracle中转换来的,是用的微软的SSMA工具转的,原来@an_id是number类型,经过工具转换后就变成了float了,我想微软应该很牛的,所以就没换成其它的。也怪我对SQL SERVER的数据类型不是太熟吧。
    二楼的不行哟,主键的数字都变了,查询不出数据来的。
      

  4.   

    再问一下,我的好多存储过程中有好多工具转换过来的float(53)。
    第一个问题是:我是不是应该把所有的参数中的float换成numeric,因为数据库中基本都是numric的。而且这些参数都是查询用到的参数。
    第二个问题是:数据库中可能是numeric(18,0),numeric(12,0),就是说长度不同,我不想去查每个用到的参数需要多长,能不能直接把参数设大点,如:numeric(30,0),这样的话,会不会影响后面的查询语句能得到正确执行结果。谢谢
      

  5.   

    怎么又问了一次?不是发过一个帖子了么?
    把FLOAT换成NUMBERIC或者DEC试下
      

  6.   

    晕,怎么我打开这个帖子后面没别人的回复呢?我发帖子后却又出现一大堆回复?
    应该全部换成NUMBERIC.拷贝到记事本,然后全部转换.长度可以设置长些,长了不要紧,短了会出问题的