Как получить весь столбец VARCHAR (MAX) с помощью Python pypyodbc

У меня есть программа Python, которая подключается к базе данных MSSQL с помощью соединения ODBC. Библиотека Python, которую я использую, называется pypyodbc.

Вот моя установка:

  • Windows 8.1 x64
  • SQL Server 2014 x64
  • Питон 2.7.9150
  • ПиПиОДБК 1.3.3
  • Драйвер ODBC: собственный клиент SQL Server 11.0

Проблема, с которой я сталкиваюсь, заключается в том, что когда я запрашиваю таблицу со столбцом varchar (max), содержимое усекается.

Я новичок в pypyodbc, и я искал как сумасшедший и не могу найти ничего о том, как предотвратить это в pypyodbc или даже pyodbc. По крайней мере, не с поисковыми терминами, которые я использовал, и я не знаю, какие еще фразы попробовать.

Я даже пытался добавить SET TEXTSIZE 2147483647; к моему SQL-запросу, но данные все равно усекаются.

Как предотвратить это? Или вы можете указать мне правильное направление, пожалуйста?

ОБНОВЛЕНИЕ:

Итак, я попытался выполнить приведение в своем SQL-запросе. Когда я делаю CAST(my_column as VARCHAR(MAX)), он усекается в той же позиции. Однако, если я делаю CAST(my_column as VARCHAR(8000)), это дает мне больший набор текста, но все же усекает часть содержимого. Если я попытаюсь сделать что-то большее, чем 8000, я получу сообщение об ошибке, говорящее, что 8000 — это максимальное значение, которое я могу использовать. Кто-нибудь знает, что здесь может происходить? Кажется странным, что использование MAX не сработает.


person CM-Dev    schedule 23.11.2015    source источник
comment
Я смог воссоздать вашу проблему с помощью pypyodbc: мои 9386 символов текста из моего столбца VARCHAR(MAX) были усечены до 2047 символов. Точно такой же код Python возвращал полную строку, когда я использовал pyodbc вместо pypyodbc.   -  person Gord Thompson    schedule 24.11.2015
comment
@GordThompson Спасибо за ваш комментарий. Недавно я попытался использовать pyodbc вместо pypyodbc и по какой-то причине не смог заставить его полностью вернуть мой набор данных. Возможно, проблема могла быть вызвана чем-то несвязанным, но я нашел рабочее решение (я только что опубликовал его как ответ) вскоре после попытки pyodbc, и в итоге я отказался от идеи pyodbc. Если у меня будет время, я попытаюсь полностью реализовать pyodbc в качестве теста. Таким образом, я могу опубликовать свои выводы для других, которые могут столкнуться с этой проблемой; в случае, если мое другое решение не работает для них. Спасибо еще раз!   -  person CM-Dev    schedule 24.11.2015


Ответы (3)


Ну в итоге я решил проблему. Я нашел эту ссылку, касающуюся аналогичной проблемы, но не в python, и они обнаружили, что проблема связана с собственным драйвером клиента SQL Server. Вместо этого они рекомендовали использовать стандартный драйвер SQL Server.

Поэтому я изменил свой драйвер в строке подключения ODBC с SQL Server Native Client 11.0 на SQL Server, и он отлично работает! Я получаю все содержимое столбца VARCHAR(MAX) в своей таблице данных MSSQL.

Я действительно надеюсь, что это окажется полезным для всех, кто сталкивается с этой проблемой! Удачи!

Вот ссылка: http://www.sqlservercentral.com/Forums/Topic1534163-391-1.aspx

person CM-Dev    schedule 24.11.2015

«{SQL Server}» в моем случае не работает. "{SQL Server}" прекрасно работает, если база данных находится на моем локальном компьютере. Однако, если бы я попытался подключиться к удаленному серверу, всегда возвращалось бы следующее сообщение об ошибке:

pypyodbc.DatabaseError: ('08001', '[08001] [Microsoft] [драйвер ODBC SQL Server] [DBNETLIB] ошибка безопасности SSL')

Для тех, кто все еще борется с усечением VARCHAR(MAX), блестящий обходной путь, предложенный моим коллегой, состоит в том, чтобы ПРИВЕСТИ VARCHAR(MAX) к TEXT< /сильный> тип.

Допустим, у нас есть столбец с именем note и его тип данных VARCHAR(MAX), вместо использования SELECT note FROM notebook мы записываем SELECT CAST(note AS TEXT) FROM notebook.

Надеюсь, поможет!

person Castiel Wong    schedule 08.11.2018

Я предполагаю, что вы используете FreeTDS, так как я видел эту проблему раньше. В вашем файле freetds.conf, вероятно, в разделе [global]:

[global]
text size = 64512

В зависимости от вашей версии SQL Server измените это на:

[global]
text size = 4294967295

Вам также нужно будет изменить любой из ваших DSN.

Если это не проблема, нам потребуется дополнительная информация: вы подключаетесь из Linux или Windows? Какая версия SQL Server? Какой драйвер используете для подключения?

person FlipperPA    schedule 23.11.2015
comment
Я не верю, что проблема в этом, разве это не применимо только к Linux? Я подключаюсь с компьютера с Windows. Это SQL Server 2014. Это драйвер, который я использую для подключения ODBC: SQL Server Native Client 11.0. - person CM-Dev; 23.11.2015
comment
Есть ли аналогичный способ изменить атрибут размера текста для соединителя pypyodbc? - person CM-Dev; 23.11.2015
comment
Ах, это не применимо в этом случае. Вы не указали, что работаете в Windows, поэтому я поставил «Я предполагаю, что вы используете FreeTDS», потому что я видел, как эта проблема возникала раньше. Не могли бы вы изменить свой вопрос, указав: что вы используете Windows (и версию, и 32 против 64), вашу версию SQL Server (и 32 против 64), версию Python (и 32 против 64), версию pypyodbc и драйвер ? Эта информация обязательно поможет. - person FlipperPA; 23.11.2015
comment
Я полностью понимаю. Да, я обязательно добавлю это к моему вопросу. Пока я этим занимаюсь, знаете ли вы о решении для Windows, которое я могу попробовать? К сожалению, я еще не нашел ни одного там. - person CM-Dev; 23.11.2015