以下自定义函数在语法检查时有下述错误。请教问题到底出在哪里?CREATE FUNCTION F_INCom(@code char(16))  
RETURNS varchar(1000) AS  
BEGIN
    declare @_tempstr varchar(1000) 
    set @_tempstr = '' 
    select @_tempstr = @_tempstr + ',' + rtrim(T_bjyt.itemno)
      from T_bjyt     where T_bjyt.scode = @code 
    select @_tempstr = case
               when @_tempstr <> '' then
                    left( @_tempstr, len(@_tempstr) - 1)
               else
                    null
               end 
    return (@_tempstr) 
END错误提示
服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: 'FUNCTION' 附近有语法错误。
服务器: 消息 137,级别 15,状态 1,行 8
必须声明变量 '@code'。
服务器: 消息 178,级别 15,状态 1,行 16
在此上下文中不能使用带有返回值的 RETURN 语句。我把SQL SERVER联机丛书中的示例在查询分析器测试,出现以下结果:CREATE FUNCTION ISOweek  (@DATE datetime)
RETURNS int
AS
BEGIN
   DECLARE @ISOweek int
   SET @ISOweek= DATEPART(wk,@DATE)+1
      -DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104')
--Special cases: Jan 1-3 may belong to the previous year
   IF (@ISOweek=0) 
      SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1 
         AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1
--Special case: Dec 29-31 may belong to the next year
   IF ((DATEPART(mm,@DATE)=12) AND 
      ((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))
      SET @ISOweek=1
   RETURN(@ISOweek)
END
服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: 'FUNCTION' 附近有语法错误。
服务器: 消息 137,级别 15,状态 1,行 6
必须声明变量 '@DATE'。
服务器: 消息 137,级别 15,状态 1,行 10
必须声明变量 '@DATE'。
服务器: 消息 137,级别 15,状态 1,行 13
必须声明变量 '@DATE'。
服务器: 消息 178,级别 15,状态 1,行 17
在此上下文中不能使用带有返回值的 RETURN 语句。我真不知道问题出在哪里了!求高手赐教

解决方案 »

  1.   

     RETURN(@ISOweek)
    不要括号
     RETURN @ISOweek
      

  2.   

    哪里错了???
    CREATE FUNCTION ISOweek (@DATE datetime)
    RETURNS int
    AS
    BEGIN
      DECLARE @ISOweek int
      SET @ISOweek= DATEPART(wk,@DATE)+1
      -DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104')
    --Special cases: Jan 1-3 may belong to the previous year
      IF (@ISOweek=0)  
      SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1  
      AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1
    --Special case: Dec 29-31 may belong to the next year
      IF ((DATEPART(mm,@DATE)=12) AND  
      ((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))
      SET @ISOweek=1
      RETURN(@ISOweek)
    END
    go
    select dbo.isoweek(getdate())
    go
    drop function isoweek
    /*-----------
    2(1 行受影响)*/
      

  3.   

    呵呵,试过了。在SQL SERVER 2005中是正常的。只是楼主的逻辑有一点点儿问题:
    --DROP TABLE T_bjyt
    CREATE TABLE T_bjyt
    (
    scode CHAR(16),
    itemno VARCHAR(100)
    )
    INSERT INTO T_bjyt
    SELECT '0001', 'test1' UNION ALL
    SELECT '0001', 'test2'
    --------------------
    ALTER FUNCTION F_INCom ( @code CHAR(16) )
    RETURNS VARCHAR(1000)
    AS 
        BEGIN
            DECLARE @_tempstr VARCHAR(1000) 
            SET @_tempstr = '' 
            
            SELECT  @_tempstr = @_tempstr + ',' + RTRIM(T_bjyt.itemno)
            FROM    T_bjyt
            WHERE   T_bjyt.scode = @code 
            
            SELECT  @_tempstr = CASE WHEN @_tempstr <> ''
                                     --THEN LEFT(@_tempstr, LEN(@_tempstr) - 1)
                                     THEN RIGHT(@_tempstr, LEN(@_tempstr) - 1)
                                     ELSE NULL
                                END 
            RETURN (@_tempstr) 
        END
    --test
    SELECT  test.dbo.F_INCom('0001')
      

  4.   


    在存储过程里定义一个变量,这个变量类型和函数里的变量类型一样,将函数里的变量值赋给新建的变量,在函数里面的语句里将所有的函数变量换成这个新建的变量,如:
    CREATE FUNCTION ISOweek (@DATE datetime)
    RETURNS int
    AS
    BEGIN
      DECLARE @ISOweek int
      DECLARE @DATA    datetime   --  新建变量
      SET @DATA = @DATE           --  将函数变量值给它,并将下边所有的@DATE换成@DATA
      SET @ISOweek= DATEPART(wk,@DATE)+1
      -DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104')
    --Special cases: Jan 1-3 may belong to the previous year
      IF (@ISOweek=0)  
      SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1  
      AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1
    --Special case: Dec 29-31 may belong to the next year
      IF ((DATEPART(mm,@DATE)=12) AND  
      ((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))
      SET @ISOweek=1
      RETURN(@ISOweek)
    END