写了个简单自定义函数如下,作用是根据表名和查询条件从数据库某张表的某个字段中取出数据并返回,但调用该函数时总是报错:必须声明变量 '@tb'。
请教一下是哪里错了。drop function get_result;
go
create function get_result(@tb varchar(100),@condition varchar(100))
returns varchar(4000)
begin
declare @result varchar(4000)
select @result=cp_id from @tb where @condition
return (@result)
end
go--调用
select * from get_result('tb_ua_admin','admin_id=1')

解决方案 »

  1.   

    这样的问题已经有人问过多遍了,动态SQL需要使用EXEC,而至少在SQLSERVER2000中是无法用函数来解决的,只能使用存储过程.
      

  2.   

    drop proc get_reslult
    go
    create proc get_result
    @tb varchar(100),
    @condition varchar(100),
    @result varchar(4000) output
    as
    select @result=cp_id from @tb where @condition
    go
    declare @result varchar(25)
    exec get_reslult 'tb_ua_admin','admin_id=1',@result output print @result 
    go换成了存储过程还是报:必须声明变量 '@tb'。
    请问怎么改?
      

  3.   

    if object_id('get_reslult') is not null
    drop proc get_reslult
    go
    create proc get_result
    @tb varchar(100),
    @condition varchar(100),
    @result varchar(4000) output
    as
    declare @sql nvarchar(1000)
    set @sql = N'select @result=cp_id from ' + @tb + ' where ' + @condition
    EXEC sp_executesql @sql,N'@result varchar(4000) output',@result output
    go
    declare @result varchar(25)
    exec get_reslult 'tb_ua_admin','admin_id=1',@result output print @result 
    go
      

  4.   

    set @sql = N'select @result=cp_id from ' + @tb + ' where ' + @condition请问:select语句之前加个N是什么意思?
      

  5.   

    N前缀表示该字符常量是UNICODE字符常量.之所以要将@sql声明为nvarchar类型并且对@sql赋值时要使用N前缀,完全是因为sp_executesql这个存储过程的要求,也就是说这是SQLSERVER的规定,我们只要遵守就行了.具体请参考sp_executesql帮助.
      

  6.   

    建完存储过程后,执行:declare @result varchar(25)
    exec get_reslult 'tb_ua_admin','admin_id=1',@result output print @result 
    go查询分析器咋没输出@result的值呢?
      

  7.   


    print @result 
    改成
    select @result 试试.
      

  8.   

    居然输出为:                          
    ------------------------- 
    NULL可tb_ua_admin表的cp_id字段明明有值:
    CP_ID      
    ---------------------------
    1,2
      

  9.   

    这样查询一下,看看结果是什么:
    select cp_id from tb_ua_admin where admin_id=1
      

  10.   

    嗯,可以了。
                              
    ------------------------- 
    1,2为什么输出要用:select @result 呢?
    以前一直用的print 哦。
      

  11.   

    用print @result也可以.
    select语句的结果通常是在查询分析器的"网格"页面显示;
    print语句的结果通常是在查询分析器的"消息"页面显示.
      

  12.   

    print我用查询分析器的“文本显示结果”也不行哦?再问一下:我写个函数能在内部调用上面的存储过程吗?
      

  13.   

    再问一下:我写个函数能在内部调用上面的存储过程吗?
    ------------------------------------------------------------------------
    不能.因为函数内部不允许使用EXEC执行除了扩展存储过程以外的存储过程(如系统存储过程或自定义的存储过程).
      

  14.   

    print我用查询分析器的“文本显示结果”也不行哦?
    ------------------------------------------------------------------------
    肯定显示了,不过因为你定义的@result的长度太长了,跑到最右边去了.拖动横向滚动条到右侧就能看到了.
      

  15.   

    print @result 已经可以了。