create FUNCTION [dbo].[s_p](@C1 varchar(10))returns varchar(8000)asbegin  declare @sql varchar(8000),
  declare @sql_data varchar(8000)
set @sql=''
  select @sql=@sql+p_sehao+',' from @sql_data where p_id=@C1 order by p_o
  if @sql<>'' set @sql=substring(@sql,1,len(@sql)-1)
  return @sqlend
以上的函数写法 显示 必须声明表变量 "@sql_data"。
论坛中有高手说可以写成存储过程,本人水平有限,写不出.请高人协助,谢谢

解决方案 »

  1.   

    @sql_data从哪里来的?自己定义了一个变量,就在那用?基本的东西你都没搞懂啊。
      

  2.   

    set  @sql_data='table1'.要先赋值
      

  3.   

     用函数与存储过程都可实现,本质没多大区别
     @sql_data 是不表名?,但没有入值
     估计要用动态拼接,动态生成sp_executesql
      

  4.   


    create FUNCTION [dbo].[s_p](@C1 varchar(10), @sql_data varchar(128))returns varchar(8000)asbegindeclare @sql varchar(8000)
     
    set @sql='select p_sehao from '+ @sql_data +' where p_id='+@C1 +'order by p_o'
      
    return @sqlend
      

  5.   


    --不知道这样子是不是楼主想要的!create table tb(id int,cname varchar(10))
    insert into tb
    select 1,'a' union all
    select 1,'b' union all
    select 2,'a'
    gocreate proc get_all(@id int,@tbname varchar(100))
    as
    begin
    declare @sql nvarchar(4000)
    declare @return nvarchar(1000)
    set @return = ''
    set @sql = 'select @return = @return + cname + '','' from ' + @tbname + ' where id = ' + ltrim(@id) + ''
    exec sp_executesql @sql,N'@return nvarchar(1000) output',@return output
    select substring(@return,1,len(@return)-1)
    end
    goexec get_all 1,'tb'drop proc get_all
    drop table tb/*
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    a,b(1 行受影响)
      

  6.   

    Create procedure s_p
    (
    @C1 varchar(10),
    @sql_data varchar(100)
    )
    as
    begin
      declare @sql varchar(8000)
      declare @return varchar(100)
      set @sql = 'select @return = @return + p_sehao+'','' from '+@sql_data+' where p_id = '+@C1+' order by p_o'
      exec sp_executesql @sql,N'@return varchar(1000) output','@return output'
      if @return <> ''
      set @return = substring(@return,1,len(@return)-1)
    end
      

  7.   

    create table tt(id int,p_id int,p_sehao varchar(20),p_o varchar(20))
    insert into tt
    select 1,1,'1','1'
    Create procedure s_p
    (
    @C1 varchar(10),
    @sql_data varchar(100)
    )
    as
    begin
      declare @sql nvarchar(4000)
      declare @return nvarchar(100)
      set @sql = 'select @return = p_sehao from '+@sql_data+' where p_id = '+@C1+' order by p_o'
      exec sp_executesql @sql,N'@return nvarchar(100) output',@return output
      select isnull(@return,'NULL')
    endexec s_p 1,'tt'
    drop table tt
    drop procedure s_p
    ----------------------------------------------------------------------------------------------------
    1(1 行受影响)