数据库中表的结构如下:
自增长序列 货架号  位置1    位置2   位置3    位置4   位置5   位置6  位置7  位置8  位置9  位置10  位置11 位置12
    1      07   072110  072112  072105  072106  072103 072123  .....我想查询后变成 前两列可以不要,后面变成如下  位置      货号
  位置1   072110
  位置2   072112
  位置3   072105
  位置4   072106
  位置5   072103
  位置6   072123
    .       .
    .       .
    .       .
我们的数据库是SQL Server2000,
不知如何实现,难道要写11个Union ALL 语句?
2005里有个运算符好像2000不支持

解决方案 »

  1.   

    http://topic.csdn.net/u/20080604/17/0493d6bc-ee35-4812-9334-20094131834d.html
      

  2.   


    我们的数据库是SQL Server2000, 
    不知如何实现,难道要写11个Union ALL 语句? 没有更好的方法了,可以写成动态的sql语句,拼成一个sql字符串最后用exec()执行
      

  3.   

    if object_id('tb')is not null 
      drop table tb
    go
    create table tb(姓名 varchar(10) , 語文 int , 數學 int , 物理 int)
    insert into tb values('張三',74,83,93)
    insert into tb values('李四',74,84,94)
    go
    select * from (
    select 姓名,課程='語文',分數=語文  from tb  union all
    select 姓名,課程='數學',分數=數學  from tb  union all
    select 姓名,課程='物理',分數=物理  from tb)as b order by 姓名
      

  4.   

    --如果不想用union all,就用下面的动态SQL.create table tb(自增长序列 int , 货架号 varchar(10), 位置1 varchar(10), 位置2 varchar(10), 位置3 varchar(10), 位置4 varchar(10), 位置5 varchar(10), 位置6 varchar(10), 位置7 varchar(10), 位置8 varchar(10), 位置9 varchar(10), 位置10 varchar(10), 位置11 varchar(10),位置12 varchar(10)) 
    insert into tb values(1,'07','072110','072112','072105','072106','072103','072123','位置7的值','位置8的值','位置9的值','位置10的值','位置11的值','位置12的值') 
    go--SQL SERVER 2000 动态SQL。
    --调用系统表动态生态。
    declare @sql varchar(8000)
    select @sql = isnull(@sql + ' union all ' , '' ) + ' select [位置] = ' + quotename(Name , '''') + ' , [货号] = ' + quotename(Name) + ' from tb'
    from syscolumns 
    where name! = N'自增长序列' and name! = N'货架号' and ID = object_id('tb') --表名tb,不包含列名为姓名的其它列
    order by colid asc
    exec(@sql)drop table tb/*
    位置     货号         
    ------ ---------- 
    位置1    072110
    位置2    072112
    位置3    072105
    位置4    072106
    位置5    072103
    位置6    072123
    位置7    位置7的值
    位置8    位置8的值
    位置9    位置9的值
    位置10   位置10的值
    位置11   位置11的值
    位置12   位置12的值
    */
      

  5.   

    動態的
    if object_id('tb')is not null 
      drop table tb
    go
    create table tb(姓名 varchar(10) , 語文 int , 數學 int , 物理 int)
    insert into tb values('張三',74,83,93)
    insert into tb values('李四',74,84,94)
    godeclare @sql varchar(8000)
    select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 , [课程] = ' + quotename(Name , '''') + ' , [分数] = ' + quotename(Name) + ' from tb'
    from syscolumns 
    where name! = N'姓名' and ID = object_id('tb') --表名tb,不包含列名为姓名的其它列
    order by colid asc
    exec(@sql + ' order by 姓名 ')