none
求助~在ms sql里怎么用字符串替代列名? RRS feed

  • 问题

  • 比如说表A的有两列 col1,col2
    在表col_name里有2条记录
    col1 代码
    col2 名称

    要在查询的时候
    select
    col1 as 代码,
    col2 as 名称
    from A


    当有n个字段coln的时候
    col_name也有n条记录
    ————————————
    select
    col1 as 代码,
    col2 as 名称,
    ...
    coln as 其他
    from A

    ——————————————
    col1 as 代码,
    col2 as 名称,
    ...
    coln as 其他
    这段我想写成一个语句,其实就是想用一个查询结果来替代列名

    col1,col2是表A里的列名



    col1 代码
    col2 名称
    是表col_name的记录

    2009年11月19日 6:52

答案

  • 只能拼sql字符串,然后用exec执行
    declare @sql nvarchar(max)
    set @sql = 'select '
    select @sql = @sql + name + ' as ' + query_col_name(name) from sys.columns ...
    set @sql = @sql + 'from ...'  
    exec (@sql)
    想不想时已是想,不如不想都不想。
    2009年11月19日 9:01
    版主
  • 比如说表A的有两列 col1,col2
    在表col_name里有2条记录
    col1 代码
    col2 名称

    要在查询的时候
    select
    col1 as 代码,
    col2 as 名称
    from A


    当有n个字段coln的时候
    col_name也有n条记录
    ————————————
    select
    col1 as 代码,
    col2 as 名称,
    ...
    coln as 其他
    from A

    ——————————————
    col1 as 代码,
    col2 as 名称,
    ...
    coln as 其他
    这段我想写成一个语句,其实就是想用一个查询结果来替代列名

    col1,col2是表A里的列名



    col1 代码
    col2 名称
    是表col_name的记录

    create table ta(col1 int,col2 varchar(10))
    create table tb(a varchar(10),b varchar(10))
    insert ta select 1,'ta'
    insert tb select 'col1','id'
    insert tb select 'col2','name'
    go
    declare @s varchar(100)
    select @s = isnull(@s+',','')+a+' as ['+b+'] '
    from tb
    exec(' select '+ @s+' from ta')
    /*
    id          name
    ----------- ----------
    1           ta
    
    (1 行受影响)
    */
    drop table ta,tb


    More: blog.csdn.net/happyflystone
    2009年11月20日 11:37

全部回复

  • 就是类似于
    SELECT
    (
      SELECT NAME FROM SYSCOLUMNS
      WHERE id=(SELECT id FROM SYSOBJECTS WHERE NAME='A')
    )
    AS (select * query_col_name(A,
    (SELECT NAME FROM SYSCOLUMNS
      WHERE id=(SELECT id FROM SYSOBJECTS WHERE NAME='A'))
    )) FROM A
    这里的函数query_col_name是我定义出来查找对应表中,对应的列名的中文名称
    但是我的写法不对,字符串不知道怎么来表示列名,系统表里返回的也是个字符串形式
    就算用COL_NAME函数返回的也是个字符串名
    用[]里面直接加SQL语句也不对
    2009年11月19日 7:05
  • 只能拼sql字符串,然后用exec执行
    declare @sql nvarchar(max)
    set @sql = 'select '
    select @sql = @sql + name + ' as ' + query_col_name(name) from sys.columns ...
    set @sql = @sql + 'from ...'  
    exec (@sql)
    想不想时已是想,不如不想都不想。
    2009年11月19日 9:01
    版主
  • 你的意思是说a表的所有字段名字都在col_name里面且是唯一的记录?

     动态语句吧!
    遍历col_name表生成查询表a的记录!



    declare @sql varchar(8000) 

     @sql= @sql+"select  "

    游标开始
        @sql= @sql+col_name的字段名+" as ''"+col_name的对应的别名+''''
        if 未到表的最后1条记录 
              @sql= @sql+","
     游标结束
     @sql= @sql+"from a"

    exec(@sql)

    2009年11月20日 8:19
  • 比如说表A的有两列 col1,col2
    在表col_name里有2条记录
    col1 代码
    col2 名称

    要在查询的时候
    select
    col1 as 代码,
    col2 as 名称
    from A


    当有n个字段coln的时候
    col_name也有n条记录
    ————————————
    select
    col1 as 代码,
    col2 as 名称,
    ...
    coln as 其他
    from A

    ——————————————
    col1 as 代码,
    col2 as 名称,
    ...
    coln as 其他
    这段我想写成一个语句,其实就是想用一个查询结果来替代列名

    col1,col2是表A里的列名



    col1 代码
    col2 名称
    是表col_name的记录

    create table ta(col1 int,col2 varchar(10))
    create table tb(a varchar(10),b varchar(10))
    insert ta select 1,'ta'
    insert tb select 'col1','id'
    insert tb select 'col2','name'
    go
    declare @s varchar(100)
    select @s = isnull(@s+',','')+a+' as ['+b+'] '
    from tb
    exec(' select '+ @s+' from ta')
    /*
    id          name
    ----------- ----------
    1           ta
    
    (1 行受影响)
    */
    drop table ta,tb


    More: blog.csdn.net/happyflystone
    2009年11月20日 11:37