问题是这样的:进行查询统计时,行大概有22行,列有24列,然后进行行列转换
是采用坛子上通常的做法,如下所示
ALTER    function dbo.funGetCompanySort(@str varchar(100))
returns  varchar(2000)
as 
begin
      declare @ret varchar(2000) --返回的字符串
      set @ret='Select '''+@str+''' [IndexName]'
      select @ret=@ret+',['+BM+']=max(case when BM='''+BM+''' then '+@str+' end)'
      from ViewCompanySort
      Set @ret = @ret+' from ViewCompanySort '
    return @ret
end
用上面得出的Sql语句
Select 'CityAward' [IndexName],[01]=max(case when BM='01' then CityAward end) .... From ViewCompanySort 
....
做为视图里的语句,在访问视图时,出现错误:在视图中函数不充许超过256个!因为要做水晶报表统计,要用到视图!我现在的想法是能不能在函数function dbo.funGetCompanySort
动手脚,去掉max?
求各位大佬帮忙解决!真是万分感谢!

解决方案 »

  1.   

    多谢libin_ftsafe(子陌红尘)关注!
    我想到一个方法也能实现,把得出的Sql语句
    Select 'CityAward' [IndexName],[01]=max(case when BM='01' then CityAward end) .... From ViewCompanySort 
    ....
    拷到函数中执行,然后在视图调用函数
    但总感觉很别扭
      

  2.   

    另外用函数
    ALTER    function dbo.funGetCompanySort(@str varchar(100))
    returns  varchar(2000)
    as 
    begin
          declare @ret varchar(2000) --返回的字符串
          set @ret='Select '''+@str+''' [IndexName]'
          select @ret=@ret+',['+BM+']=max(case when BM='''+BM+''' then '+@str+' end)'
          from ViewCompanySort
          Set @ret = @ret+' from ViewCompanySort '
        return @ret
    end
    得到的动态Sql语句,而且要求不能使用存储过程!
    只能用print 打印出sql语句,粘贴到函数中执行,因为函数中不支持exec!
    搞来搞去,总觉得采用的办法好怪!
    各位有什么好办法吗?
      

  3.   

    楼主可能忽略了这个问题:用户定义函数中不能用exec()执行动态SQL语句。
      

  4.   

    这个问题确实存在,所以只能用print打印出sql语句,
    打印出的sql语句大概有5个8000字节