从 pymssql 中的存储过程返回第一个表后无法获取列名

Can't get column names after first table return from Stored procedure in pymssql

提问人:Reza Akraminejad 提问时间:12/27/2017 最后编辑:aynberReza Akraminejad 更新时间:3/23/2023 访问量:664

问:

我在 sql server 中有一个返回多个表的过程:

create procedure newtest
as 
begin
   select 1 as a
   select 2 as b
end

在 python 中,cursor.description 只返回第一列名称:a

我想获取每个表中的每个列名。

我该怎么做?

这是我的代码:

cur.execute(com)
                num_tables=0
                while True:
                    print(cur.description)
                    ret=cur.fetchall()   

                    if len(ret)>0: 
                        ret_list.append(ret)
                        num_tables+=1
                        print(ret)                       
                    else:
                        break
python pymssql

评论

0赞 Reza Akraminejad 12/27/2017
还是没有答案?

答:

3赞 bwt 1/11/2018 #1

如果该命令返回多个表(即多个结果集)。您可以使用 Cursor.nextset() 从一个集合切换到下一个集合。

像这样:

num_tables = 0
while True:
    print(cur.description)

    # all lines of the current set
    ret = cur.fetchall()

    if len(ret) > 0:
        ret_list.append(ret)
        num_tables += 1
        print(ret)

    # check and fetch the next set
    if not cur.nextset():
        break

不会强制结果集具有相同的列计数。例如:

create procedure newtest
as 
begin
   select 1 as a
   select 2 as b, 3 as c
end

其结果是:

(('a', <class 'int'>, None, 10, 10, 0, False),)
[(1, )]
(('b', <class 'int'>, None, 10, 10, 0, False), ('c', <class 'int'>, None, 10, 10, 0, False))
[(2, 3)]

评论

0赞 Reza Akraminejad 1/14/2018
我对每个表返回都使用了 cur.connection._conn.get_header(),它起作用了
0赞 bwt 1/15/2018
如果可能的话,我建议使用标准 (PEP 249) 函数,而不是特定于驱动程序或未记录的函数