4

Linux ボックス( Python 2.7Ubuntu 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フィールドです。convert(text,ShReq.ALM_SharedText) AS TEXT255 文字に切り捨てられますが、次のような変換を使用して、CAST(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

どうすれば解決できるのでしょうか?

4

3 に答える 3

4

text sizeのinglobalセクションをfreetds.conf最大 (4294967295 バイト) に変更します。

[global]
    tds version = 8.0
    text size = 4294967295

またTEXTSIZE、SQL で最大値 (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;
      """
于 2012-08-09T15:50:37.387 に答える
1

古いバージョンの pymssql (1.0.2) を使用している場合、特定の制限があります。

varchar および nvarchar データは 255 文字に制限されており、それより長い文字列は自動的にトリミングされます。これは、TDS プロトコルの既知の制限です。回避策は、その行または式を、4000 文字を返すことができるテキスト データ型に CAST または CONVERT することです。

ソース: http://pymssql.sourceforge.net/limitations.php

于 2013-01-08T13:58:04.733 に答える