Python与MS SQL - 截断输出

时间:2012-08-09 11:56:51

标签: python sql-server odbc pyodbc pymssql

我尝试使用来自Linux box Python 2.7 Ubuntu 11.04 的python连接到MSSQL DB。我收到的输出被截断为500个字符。请参阅下面的脚本和配置。如何解决?我想在ODBC驱动程序或附近的问题。

代码(pyodbc,pymssql):

conn = pymssql.connect(host='my_remote_host', user='ro_user',
password='password', database='current', as_dict=True)
cur = conn.cursor()
cur.execute(sql)
for i in cur:
    print i
conn.close()

cnxn = pyodbc.connect(driver='FreeTDS', server='my_remote_host', database='current', uid='ro_user', pwd='password')
cursor = cnxn.cursor()
cursor.execute(sql)
rows = cursor.fetchall()
...
cnxn.close()  

我没有对MS SQL DB的写访问权,它实际上是不属于我们系统的远程服务器。

SQL:

sql = '''
        SELECT  Req.ID,
        ShReq.Summary AS [Short Name],
        ShReq.ALM_SharedText AS [Text],
        Req.ContainedBy,
        Req.DocumentID
FROM    CurMKS..ALM_Requirement Req
        JOIN CurMKS..ALM_SharedRequirement ShReq ON Req.[References] = ShReq.ID
        WHERE DocumentID = 1111111'''

问题在于ShReq.ALM_SharedText字段。它被截断为255个字符,但使用convert(text,ShReq.ALM_SharedText) AS TEXTCAST(ShReq.ALM_SharedText AS TEXT)之类的转换,我将截断增加到500个字符。但是,有些字段的文本比500个字符长,并且它们会被截断。

ODBC设置:

/etc/odbc.ini

[MKS]
#Driver=FreeTDS
Driver=/usr/lib/odbc/libtdsodbc.so
Description=Database
Trace=No
Server=my_remote_host
Port=1433
Database=current
UID=ro_user
PWD=password
TDS Version=8.0

/etc/odbcinst.ini

[FreeTDS]
Description=FreeTDS
Driver=/usr/lib/odbc/libtdsodbc.so
UsageCount=1

/etc/freetds/freetds.conf

[global]
        tds version = 8.0
;       dump file = /tmp/freetds.log
;       debug flags = 0xffff
;       timeout = 10
;       connect timeout = 10
;       text size = 2097152


[mksserver]
      host = my_remote_host
      port = 1433
      tds version = 8.0
      client charset = UTF-8

有什么想法可以解决吗?

3 个答案:

答案 0 :(得分:4)

text size的{​​{1}}部分中的global更改为最大值(4294967295字节):

freetds.conf

还必须在SQL中将[global] tds version = 8.0 text size = 4294967295 设置为最大值(2147483647字节):

TEXTSIZE

答案 1 :(得分:1)

如果您使用的是旧版本的pymssql(1.0.2),则存在某些限制。

varchar和nvarchar数据限制为255个字符,较长的字符串将被静默修剪。 这是TDS协议的已知限制。解决方法是将行或表达式CAST或CONVERT转换为文本数据类型,该类型能够返回4000个字符。

来源:http://pymssql.sourceforge.net/limitations.php

答案 2 :(得分:0)

您可以使用以下逻辑从 SQL Server 获取完整输出:

rows = connCursor.execute(spQuery).fetchall()
result = ''
result = result.join([row[0] for row in rows])

这里,spQuery 是我们将为结果执行的完整 SQL 查询。
结果,我们得到的结果是在 2033 个字符后被修剪了,所以我们将把完整的输出连接成一个字符串并执行下一个操作