declare @sql varchar(8000)
set @sql='select '
select @sql=md002+' as '+md003+',' from admmd where md001=epstb
set @sql=substring(@sql,1,len(@sql)-1)+ ' from epstb'
exec(@sql)

解决方案 »

  1.   

    declare @sql varchar(8000)
    set @sql='select '
    select @sql=@sql+md002+' as '+md003+',' from admmd where md001=epstb  --改一下
    set @sql=substring(@sql,1,len(@sql)-1)+ ' from epstb'
    exec(@sql)
      

  2.   


    --用动态语句
    declare @s varchar(8000)
    set @s=''
    select @s=@s+',['+MD003+']=['+MD002+']'
    from ADMMD
    where MD001='EPSTB'
    set @s=stuff(@s,1,1,'')
    exec('select '+@s+' from EPSTB')
      

  3.   

    http://community.csdn.net/Expert/topic/3109/3109432.xml?temp=.369137
    大家帮我看看这个帖
      

  4.   

    使用动态SQL还存在不能选取字段的问题,因为它取出了全部字段.按照动态SQL的思路写了一个函数:
    --****检查函数是否存在
    if exists(select 1 from sysobjects where id=object_id(N'[dbo].[FieldCast]')
       and xtype in (N'FN',N'IF',N'TF'))
       drop function FieldCast
    gocreate function FieldCast(@str char(20))
    returns varchar(8000)
    as
    begin
    declare @Result varchar(8000)
    set @Result=''
    select @Result=@Result+',['+rtrim(MD004)+']=['+rtrim(MD003)+']'
    from DSCSYS..ADMMD
    where MD001='EPSTB'
    set @Result=stuff(@Result,1,1,'')
    return(@Result)
    end
    go但是执行语句:
    exec ( 'select '+dbo.FieldCast('TB001')+' from EPSTB')
    的时候提示'dbo' 附近有语法错误。但用PRINT显示出来SQL应该没问题
    print 'select '+dbo.FieldCast('TB001')+' from EPSTB'select [通知单别]=[TB001],[通知单号]=[TB002],.... from EPSTB
      

  5.   

    --函数不能用动态SQL,这是规定未在下面的列表中列出的语句不能用在函数主体中。 赋值语句。
    控制流语句。
    DECLARE 语句,该语句定义函数局部的数据变量和游标。
    SELECT 语句,该语句包含带有表达式的选择列表,其中的表达式将值赋予函数的局部变量。
    游标操作,该操作引用在函数中声明、打开、关闭和释放的局部游标。只允许使用以 INTO 子句向局部变量赋值的 FETCH 语句;不允许使用将数据返回到客户端的 FETCH 语句。
    INSERT、UPDATE 和 DELETE 语句,这些语句修改函数的局部 table 变量。
    EXECUTE 语句调用扩展存储过程。
      

  6.   

    呵呵,只要先声明一个字符串变量,先把SQL赋给变量,在EXEC就OK了declare @str varchar(8000)
    set @str='select '+dbo.FieldCast('TB001')+' from EPSTB'
    exec(@str)
      

  7.   

    搞定,谢谢zjcxc(邹建)用了两个参数:表名,参数:
    --****检查存储过程是否存在
    if exists(select 1 from sysobjects where id=object_id(N'[dbo].[FieldCast]')
       and xtype = 'P')
      drop procedure FieldCast
    gocreate procedure FieldCast
    @str char(20),
    @param varchar(8000)
    with ENCRYPTION
    as
    begin
    declare @sqlstr varchar(8000)
    declare @sql varchar(8000)
    set @sqlstr=''
    select @sqlstr=@sqlstr+',['+rtrim(MD004)+']=['+rtrim(MD003)+']'
    from DSCSYS..ADMMD
    where MD001=@str 
    set @sqlstr=stuff(@sqlstr,1,1,'')
    set @sqlstr='select '+@sqlstr+' from '+@str+' where 1=1 '+ @param
    exec (@sqlstr)
    end
    go
      

  8.   

    clob或者long怎么用呢?能不能给我一个例子呢?
    直接的拼SQL文的。