对了,忘记说了,数据库是 SQL Server 2000

解决方案 »

  1.   

    先UPDATE..
    然后判断 
    IF @@ROWCOUNT = 0
       --再INSERT
      

  2.   

    有个问题,Update的时候就能用到索引了吗?
      

  3.   

    IF NOT EXISTS(SELECT 0 FROM TABLE WHERE UUU=@UUU AND VVV=ISNULL(@VVV,'') AND WWW=ISNULL(@WWW,'') AND XXX=ISNULL(@XXX,'') AND YYY=ISNULL(@YYY,0) AND ZZZ=ISNULL(@ZZZ,0)) 
        INSERT INTO TABLE (UUU,VVV,WWW,XXX,YYY,ZZZ) VALUES(@UUU,@VVV,@WWW,@XXX,@YYY,@ZZZ) 
    ELSE 
        UPDATE TABLE SET AAA=@AAA WHERE UUU=@UUU AND VVV=ISNULL(@VVV,'') AND WWW=ISNULL(@WWW,'') AND XXX=ISNULL(@XXX,'') AND YYY=ISNULL(@YYY,0) AND ZZZ=ISNULL(@ZZZ,0) 
      

  4.   

    能ISNULL相当于函数,会影响索引的选择,没必要的时候不要在字段上加
      

  5.   

    表中除了UUU肯定不为空外,其他的都有可能为空(NULL或''),且由于SQLServer中NULL和''不同,而在我的业务中NULL和''都是做为空处理的,这样写会不会有问题?
      

  6.   

    NULL 不太好。如果“业务中NULL和''都是做为空处理的”
    建议 1. 设置Default: ''
    2. 将库中现有的NULL数据更新为''
    3. 建一个Trigger, 将被赋值为NULL的数据以''替代调整后>
    1.可简化查询代码; 2.可用上Index
      

  7.   

    9L的说法是基于NULL值与某个具体值等价的假设,若NULL值存在特别的业务含义则另当别论。
      

  8.   

    那也不能用ISNULLISNULL(VVV,'')=ISNULL(@VVV,'')
    改成
    VVV=ISNULL(@VVV,'')
    OR VVV IS NULL AND ISNULL(@VVV,'') = ''
      

  9.   

    程序中字符串NULL和''等同,这个没有问题,但数字(int numeric float)的放''就会变成0,在业务上,0和NULL可不一样啊!总不能把数字的也改成字符串吧!
      

  10.   

    AND ISNULL(YYY,0)=ISNULL(@YYY,0)==> AND ( (YYY IS NULL and ISNULL(NULLIF(@YYY,0),0)=0) or
          (YYY = ISNULL(NULLIF(@YYY,0),0)) )因为有or逻辑,恐怕还是用不上Index
      

  11.   


    AND (VVV=ISNULL(@VVV,'') OR (VVV IS NULL AND ISNULL(@VVV,'') = ''))是不是这种?
      

  12.   

    经过测试,
    ISNULL(YYY,0)=ISNULL(@YYY,0)

    AND (VVV=ISNULL(@VVV,'') OR (VVV IS NULL AND ISNULL(@VVV,'') = ''))
    效果一样,应该都没有用到索引。
      

  13.   

    错了,AND (VVV=ISNULL(@VVV,'') OR (VVV IS NULL AND ISNULL(@VVV,'') = '')) 有问题,数据少了,应该插入的,但没有插入,被Update了。
      

  14.   

    看了执行计划,AND ISNULL(XXX,'')=ISNULL(@XXX,'') 这种的,也可以用到索引,成本为65%,如果把字符串的默认值改为''(也就是字符串字段没有NULL的情况了,数字的还有NULL),用 AND XXX=ISNULL(@XXX,'') AND ISNULL(YYY,0)=ISNULL(@YYY,0) ,索引的成本是99%各位看看还有什么方法?是不是直接Update,再看@@ROWCOUNT 再Insert 这种快呢?
      

  15.   

    这说明有效果,原来index scan占总查询的成本65%,现在index seek占总查询的99%,这个比例不是看高低的,因为总数减少了,所以比例升高了,一定程度来说,对于高效的计划(比如index seek),比例越高说明整个查询效率越高。