数据库如下
http://cms.bit.edu.cn/moodle/file.php?file=/222/%E6%95%B0%E6%8D%AEjpg.JPG需要生成交叉表如下http://cms.bit.edu.cn/moodle/file.php?file=/222/%E7%BB%93%E6%9E%9Cjpg.JPGSQL语句如下:
  declare @s nvarchar(4000)  
  set @s=''
  select @s=@s+','+'avg(case 课程 when '+课程+'then 成绩 else null end)'  
  from stu group by 课程 
 
  exec('select 姓名'+@s+' from stu group by 姓名')  
  go 出现错误
服务器: 消息 207,级别 16,状态 3,行 1
列名 '编译原理' 无效。
服务器: 消息 207,级别 16,状态 1,行 1
列名 '操作系统' 无效。
服务器: 消息 207,级别 16,状态 1,行 1
列名 '计算机网络' 无效。
服务器: 消息 207,级别 16,状态 1,行 1
列名 '数据库' 无效。
why?

解决方案 »

  1.   

    declare @s nvarchar(4000)  
    set @s='' 
    select @s=@s+','+'avg(case 课程 when '''+课程+''' then 成绩 else 0 end)'  
    from stu group by 课程 exec('select 姓名'+@s+' from stu group by 姓名')  
    go 
      

  2.   

    declare @s nvarchar(4000)  
    set @s='' 
    select @s=@s+','+'avg(case 课程 when '''+课程+''' then 成绩 else 0 end)'  
    from stu group by 课程 
    print @s你运行一下这个就知道why了……@s经过赋值后,when后面接的课程应该是字符串,比如 '编译原理' ,'操作系统' 等等,它们都必须用单引号括起来作为字符串常量。
    你原来写的语句没加单引号,致使系统认为编译原理、操作系统都是列名,显然就出错了。
    如果要加一个单引号,必须用另一个单引号作为转义符。因此你看见了:when '''+课程+'''  这样形式的串。将print出来的sql语句拷到查询分析器里,仔细看看,再执行一下,就能完全明白了。
      

  3.   


    declare @s nvarchar(4000)
    set @s='select 姓名'
    select @s=@s+ 'avg(case 课程 when + ''' + 课程 + ''' then 成绩 else null end)'
     from stu group by 课程
    set @s=@s+ 'from stu group by 姓名'
    exec(@s)
      

  4.   


    declare @s nvarchar(4000)
    set @s='select 姓名'
    select @s=@s+ ',' + 'avg(case 课程 when + ''' + 课程 + ''' then 成绩 else null end)'
     from stu group by 课程
    set @s=@s+ 'from stu group by 姓名'
    exec(@s)