存储过程里写了很复杂的SQL语句,通过拼接,动态计算等,最后exec(sql),
执行存储过程会显示拼接后的数据,如何取这个存储过程拼接后的列名呢
PS:sql语句太过复杂,没法一个个取字段把!求大神赐教,最好有类似去表列名的那种方法来取存储过程列名最好!!------------
另求:SQL有没有什么方法能把存储过程返回的语句生成临时表,并且在一个存储过程中还可以调用临时表,并且临时表的列名是动态的,不能先指定列名,应该是通过动态SQL生成的,在exec执行的SQL中可以生成动态临时表,但是出了exec就没法用了,有很多复杂的业务一个exec很难处理完,那出了exec临时表又访问不到了,主要考虑多用户同时操作问题。单用户到好处理,希望大神赐教!!不胜感谢!!

解决方案 »

  1.   

    语句:
    --测试数据
    IF OBJECT_ID('ta','u') IS NOT NULL     --测试数据表
        DROP TABLE ta
    GO
    IF OBJECT_ID('pp','p') IS NOT NULL
        DROP PROC pp
    GO
    CREATE TABLE ta (id INT,name VARCHAR(10))
    GO
    CREATE PROC pp  --测试存储过程
    AS
        SELECT * FROM ta  --返回ta表信息
    GO
    --测试数据结束
    SELECT  *
    INTO    tx
    FROM    OPENROWSET('SQLOLEDB',
                       'SERVER=localhost;uid=sa;pwd=123456;Database=Test',
                       'EXEC test.dbo.pp') AS s
    SELECT  name
    FROM    syscolumns
    WHERE   id = OBJECT_ID('tx', 'u')DROP TABLE tx
    结果:
      

  2.   

    在存储过程中  拼接字符串 加一个 select *  into TEMP1 FROM ... WHERE 1=0   不知道行不行
      

  3.   

    存储过程里写了很复杂的SQL语句,通过拼接,动态计算等,最后exec(sql),
    执行存储过程会显示拼接后的数据,如何取这个存储过程拼接后的列名呢
    PS:sql语句太过复杂,没法一个个取字段把!你用exec执行动态sql,然后会返回1个结果集,你要取这个结果集中有哪些列 对吗
      

  4.   

    重点:多用户,临时表动态生成(动态SQL语句生成),临时表还要在下面进行业务操作,所以不能在一个exec中
      

  5.   

    每个用户使用的字段:
    A)按照固有的逻辑决定的——你也按照固有的逻辑去创建临时表啊
    B)按照动态的配置决定的——那么在写这个配置的同时,(在其它专用的DB上)建一个永久表,把它当作“临时表”使用(可以加上 @@SPID 来区分不同会话的数据)
      

  6.   

    用了OPENROWSET就不能用@@SPID了
      

  7.   

    其实在执行exec([动态SQL])之前, 应该可以知道将要返回哪些列,何需动态获取.
      

  8.   

    上级调用者有啊!

    用了OPENROWSET再取@@SPID了,值就不对了。不是同一个了
      

  9.   

    上级调用者有啊!

    用了OPENROWSET再取@@SPID了,值就不对了。不是同一个了
    OPENROWSET里的@@SPID是另一个,和当前会话不一样
      

  10.   

    返回的数据流,用reader读入到dataset中间,dataset有columns的属性的,那里就能取到所有列名。