带有 MS SQL 的 Python - 截断的输出

Posted

技术标签:

【中文标题】带有 MS SQL 的 Python - 截断的输出【英文标题】:Python with MS SQL - truncated output 【发布时间】:2012-08-09 11:56:51 【问题描述】:

我尝试使用 Linux 机器中的 python 连接到 MSSQL DBPython 2.7Ubuntu 11.04。我收到的输出被截断为 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

有什么办法可以解决的吗?

【问题讨论】:

您是否尝试将text size 参数增加为directed? 尝试增加和删除它,实际上我没有注意到任何变化。 所以你尝试增加配置文件中的值,但是你是否在SQL中设置了TEXTSIZE 您使用的是pymssqlpyodbc 还是两者都使用? @beargle 如示例中所述 - pyodbc 和 pymssql。如何在 SQL 中设置 TEXTSIZE?? 【参考方案1】:

freetds.confglobal 部分中的text size 更改为最大值(4294967295 字节):

[global]
    tds version = 8.0
    text size = 4294967295

还必须将 SQL 中的 TEXTSIZE 设置为最大值(2147483647 字节):

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;
      """

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于带有 MS SQL 的 Python - 截断的输出的主要内容,如果未能解决你的问题,请参考以下文章

MS SQL:如果记录数超过 N,则执行截断

使用python截断Databricks中的增量表

sql 带有检查选项的MS SQL视图

python postgresql orm 截断表

带有 GUID 全零的 MS SQL 表

MS Access 创建表正在截断备注字段