set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER FUNCTION [dbo].[subb] ( )
RETURNS @RTable TABLE
   (
    id1 int,
id2 int
   )
AS
BEGIN
declare @i int,@j int,@x int,@b int,@e int
set @e=(select max(id2) from emp)
set @b=1
while (@b<=@e)
begin
set @i=0
WHILE (@b*power(2,@i)<=@e)
BEGIN
set @x=@b*power(2,@i)
set @j=1
while @j<=power(2,@i)
begin
if @x<>@b INSERT @RTable (id1,id2) values (@b,@x)
set @x=@x+1
IF @x>@e break
set @j=@j+1
end
set @i=@i+1
END
set @b=@b+1
end
update @RTable  set id1=emp.id from emp where [email protected]
update @RTable  set id2=emp.id from emp where [email protected]
RETURN
END
错误信息如下:
消息 137,级别 15,状态 2,过程 subb,第 32 行
必须声明标量变量 "@RTable"。
消息 137,级别 15,状态 2,过程 subb,第 33 行
必须声明标量变量 "@RTable"。
我的"@RTable"明明声明了啊?而且错误信息中所说的32行是个end语句啊!

解决方案 »

  1.   

    ALTER FUNCTION [dbo].[subb] ( ) 
    RETURNS @RTable TABLE 
      ( 
        id1 int, 
    id2 int 
      ) 
    AS 
    BEGIN
    .
    .
    .
    END楼主朋友,在你给出的代码的第2行必须把@RTable去掉就可以了.
    因为在定义自定义函数返回值时,只给出返回值类型就可以了.不该把
    变量也放进来.
      

  2.   

    还有就是,在你的函数体中定义这个@RTable变量就可以了.
      

  3.   

    谢谢回复!
    我的sql server 2005函数是特殊类型的函数啊,是表值函数,不在前面声明能行么?这个难道不是表值函数的固定格式么?如果不在那个特定位置声明,函数怎么知道是返回表值?
    我写这个函数的格式是sql server 2005自动生成的,应该没有错吧?而且我的这个函数在没加那两行update语句之前是能正常使用的,能返回正确的表。
      

  4.   

    没有 @表变量.xx 这种写法update a set id1=b.id from @rtable a inner join emp b on a.id1=b.id2
      

  5.   

    Microsoft规定SqlServer中表变量不能用做传入或是传出参数!
      

  6.   

    按五楼改了,还是不行!看来,这是个真正的难题,谁能提出不同的解决方案?
    出错信息附后。
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
    ALTER FUNCTION [dbo].[subb] ( )
    RETURNS @RTable TABLE
       (
        id1 int,
    id2 int
       )
    AS
    BEGIN
    declare @i int,@j int,@x int,@b int,@e int
    set @e=(select max(id2) from emp)
    set @b=1
    while (@b<=@e)
    begin
    set @i=0
    WHILE (@b*power(2,@i)<=@e)
    BEGIN
    set @x=@b*power(2,@i)
    set @j=1
    while @j<=power(2,@i)
    begin
    if @x<>@b INSERT @RTable (id1,id2) values (@b,@x)
    set @x=@x+1
    IF @x>@e break
    set @j=@j+1
    end
    set @i=@i+1
    END
    set @b=@b+1
    end
    -- update @RTable a set id1=emp.id from emp b where b.id2=a.id1
    -- update @RTable a set id2=emp.id from emp b where b.id2=a.id2
    update a set id1=b.id from @rtable a inner join emp b on a.id1=b.id2
    update a set id2=b.id from @rtable a inner join emp b on a.id2=b.id2
    RETURN
    END消息 443,级别 16,状态 15,过程 subb,第 34 行
    在函数内的 'UPDATE' 中对带副作用的或依赖于时间的运算符的使用无效。
    消息 443,级别 16,状态 15,过程 subb,第 35 行
    在函数内的 'UPDATE' 中对带副作用的或依赖于时间的运算符的使用无效。
      

  7.   

    我用的是 sql server 2005