On the other hand, using SQL Trace is also helpful, for example, use a trace that includes the RPC:Completed event class search for 'sp_cursorfetch' statements. The value of the fourth parameter is the number of rows returned by the fetch. It is worth noting that the maximum number of rows that are requested to be returned is specified as an input parameter in the corresponding RPC:Starting event class. Finally, by using the DMV 'sys.dm_exec_cursors' we can also determine whether poor cursor usage exists in the database server as Transact-SQL cursors always have a fetch buffer of 1 and for API cursors it should be higher.
select c.* from sys.dm_exec_sessions s cross apply sys.dm_exec_cursors(con.session_id) as c where cur.fetch_buffer_size = 1 and cur.properties LIKE 'API%'
select s.session_id, cn.client_net_address, s.login_name, s.status,s.client_interface_name, s.program_name, c.cursor_id, c.name, c.properties, c.plan_generation_num, c.creation_time, c.is_open, c.fetch_status, c.fetch_buffer_size, c.worker_time, c.reads, c.writes, c.dormant_duration from sys.dm_exec_connections cn inner join sys.dm_exec_sessions s on cn.session_id = s.session_id cross apply sys.dm_exec_cursors(s.session_id) as c where c.fetch_buffer_size = 1 and c.properties LIKE 'API%'