弱弱的问句:2000中的update语句中不能使用自定义函数么?INSERT DELETE中也不行?
如下:--更新
UPDATE #t SET gg=DBO.GetGG(na),
              na=REPLACE(na,ISNULL(DBO.GetGG(na),''),'')--MS-SQL SERVER2008中测试通过,是可以这样用。别人拿代码在2000中报错:服务器: 消息 208,级别 16,状态 1,行 1
对象名 'DBO.GetGG' 无效。
服务器: 消息 208,级别 16,状态 1,行 1
对象名 'DBO.GetGG' 无效。要改成以下这样么?以下2008依然是正确的UPDATE #t SET gg=DBO.GetGG(na),
              na=REPLACE(na,ISNULL(DBO.GetGG(na),''),'')
FROM #t
2000的一些规则不熟悉啊..我看书上没提在自定义函数的使用上2005以及以上版本较2000有了较大的更改呀.求解释..

解决方案 »

  1.   

    DBO.GetGG--這個函數在當前環境不存在
    select * from sysobjects where Name='GetGG'--查看
      

  2.   

    嗯,自定义函数……如下:
    CREATE TABLE #t
    (
      na   VARCHAR(20),
      gg   VARCHAR(10)
    );INSERT INTO #t ( na )
      SELECT '可口可乐500ml'     UNION ALL
      SELECT '500ml可口可乐'     UNION ALL
      SELECT '旺仔QQ糖32g'       UNION ALL
      SELECT '可比克35g薯片'     UNION ALL
      SELECT '晨奇中性笔GP-148'  UNION ALL
      SELECT '114BY文具盒'       UNION ALL
      SELECT '2.5kg白糖'         UNION ALL
      SELECT '晨奇148象皮擦'
    GO -- 根据单位,获取 规格内容
    CREATE FUNCTION DBO.GetGGByUnit(@na VARCHAR(20),  @u VARCHAR(5))
    RETURNS VARCHAR(10)
    AS
    BEGIN
      -- 单位的位置.
      DECLARE @idx  INT
      DECLARE @idx2 INT
      -- 返回值.
      DECLARE @returnValue VARCHAR(10)
      -- 初始化.
      SET @returnValue = NULL
      -- 取得单位的位置.
      SET @idx = CHARINDEX(@u, @na)
      IF @idx + LEN(@u) - 1 = LEN(@na)
      BEGIN
        -- 这个 单位的 位置,是在名称的末尾
        -- 需要向前找数字.
        SET @returnValue = RIGHT(@na, LEN(@na) - PATINDEX('%[0-9]%', @na) + 1)
      END
      ELSE
      BEGIN
        -- 这个 单位的 位置, 不是在名称的末尾, 可能是在开头, 可能在中间
        SET @idx2 = PATINDEX('%[0-9]%', @na);
        IF @idx2 > @idx 
        BEGIN
          -- 单位 与  数字的 关系
          -- 是 先单位 后 数字的。是无效的数据.
          SET @returnValue = NULL;
        END
        ELSE
        BEGIN
          -- 数字 在 单位 前面.
          SET @returnValue = SUBSTRING(@na, @idx2,  (@idx - @idx2 + 2) );
        END
      END
      -- 返回.
      RETURN @returnValue;
    END;
    GO  -- 获取 规格内容
    CREATE FUNCTION DBO.GetGG(@na  VARCHAR(20))
    RETURNS VARCHAR(10)
    AS
    BEGIN
      -- 返回值.
      DECLARE @returnValue VARCHAR(10)
      -- 初始化.
      SET @returnValue = NULL
      -- 这里根据需要,自行增加各种单位
      IF CHARINDEX('ml', @na) > 0
      BEGIN
        SET @returnValue = DBO.GetGGByUnit(@na, 'ml')
      END
      ELSE IF CHARINDEX('kg', @na) > 0
      BEGIN
        SET @returnValue = DBO.GetGGByUnit(@na, 'kg')
      END
      ELSE IF CHARINDEX('g', @na) > 0
      BEGIN
        SET @returnValue = DBO.GetGGByUnit(@na, 'g')
      END
      -- 返回.
      RETURN @returnValue
    END;
    GO 
    --更新
    UPDATE #t SET gg=DBO.GetGG(na),
                  na=REPLACE(na,ISNULL(DBO.GetGG(na),''),'')
    ---
    --UPDATE #t SET gg=DBO.GetGG(na),
    --              na=REPLACE(na,ISNULL(DBO.GetGG(na),''),'')
    --              FROM #t
    ---
    SELECT * FROM #t--删除演示环境
    DROP FUNCTION DBO.GetGGByUnit,DBO.GetGG
    DROP TABLE #TMS SQL SERVER2008中OK的,听人家在2000里运行返回说出错,我想确定下2000中是否可以在UPDATE中和INSERT、DELETE语句中使用自定义函数。
      

  3.   

     '晨奇148象皮擦'--这条用不用取 148
    '114BY文具盒' --这条用不用取114BY
      

  4.   

      SELECT '可口可乐500ml'     UNION ALL
      SELECT '500ml可口可乐'     UNION ALL
      SELECT '旺仔QQ糖32g'       UNION ALL
      SELECT '可比克35g薯片'     UNION ALL
      SELECT '晨奇中性笔GP-148'  UNION ALL
      SELECT '114BY文具盒'       UNION ALL
      SELECT '2.5kg白糖'         UNION ALL
      SELECT '晨奇148象皮擦'-------------把结果贴出来看看
      

  5.   


    嗯 谢谢大家..不是代码问题 2000中确实能在UPDATE\INSERT \DELETE中使用自定义函数.运行时搞错了.