Python con MS SQL – salida truncada

Intento conectarme a MSSQL DB con python desde Linux ( Python 2.7 , Ubuntu 11.04 ) . La salida que recibo se trunca a 500 caracteres. Por favor, vea el script y las configuraciones a continuación. ¿Cómo podría resolverse? El problema supongo que en el controlador ODBC o cerca de él.

El código (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() 

No tengo acceso de escritura a MS SQL DB, en realidad es un servidor remoto que no pertenece a nuestro sistema.

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''' 

El problema es con el campo ShReq.ALM_SharedText . Se trunca a 255 caracteres, pero utilizando conversiones como convert(text,ShReq.ALM_SharedText) AS TEXT y CAST(ShReq.ALM_SharedText AS TEXT) Aumento de truncado a 500 caracteres. Sin embargo, hay campos con un texto más largo que 500 caracteres y están truncados.

Configuraciones 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 

¿Alguna idea de cómo podría resolverse?

Cambie el text size del text size en global sección global de freetds.conf al máximo (4294967295 bytes):

 [global] tds version = 8.0 text size = 4294967295 

También hay que establecer TEXTSIZE en SQL al máximo (2147483647 bytes):

 sql = """ SET TEXTSIZE 2147483647; 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 = 111111; """ 

Si está utilizando la versión anterior de pymssql (1.0.2), hay ciertas limitaciones.

los datos varchar y nvarchar están limitados a 255 caracteres, y las cadenas más largas se recortan en silencio. Esta es la limitación conocida del protocolo TDS. Una solución alternativa es CAST o CONVERTIR esa fila o expresión para el tipo de datos de texto, que puede devolver 4000 caracteres.

fuente: http://pymssql.sourceforge.net/limitations.php