Assume that you use a sqlncli11.dll ODBC driver to access Microsoft SQL Server 2012 or SQL Server 2014 in an application. When you use server cursor and the SQLFetch/ SQLGetData function to access some binary large object (BLOB) data in SQL Server, a performance issue occurs especially for large data types like varbinary (max) or varchar (max).
This is a design issue for implementation of the SQLFetch/ SQLGetData function in SQL Server 2012 ODBC driver. When the query uses any server cursors, the ODBC driver invokes sp_cursorfetch during the SQLFetch implementation, and the server sends all the BLOB to the client. Then, when SQLGetData is executed, sp_cursor brings all the BLOB again. This greatly affects the performance for large data types like varbinary (max) or varchar (max).
Cumulative Update informationThe new implementation invokes sp_cursoroption to obtain TEXTPTR_ONLY before the sp_cursorfetch, and then invokes sp_cursoroption to put it back to TEXTDATA before the sp_cursor. This can improve the performance.
The issue was first fixed in the following cumulative update of SQL Server.
Microsoft has confirmed that this is a problem in the Microsoft products that are listed in the "Applies to" section.