|
DISTINCT в ADODB и в Management Studio
|
|||
---|---|---|---|
#18+
Помогите разобраться. Ситуация: Скрипт на VBS отправляет запрос Q к MS SQL Server 2008R2 посредством ADODB (Provider = "SQLOLEDB"). Q = "SELECT DISTINCT A FROM Table" В результате исполнения ADODB.Recordset возвращается пустой. Этот же запрос Q , исполненный в MS SQL Server Management Studio возвращает 51 строку. Таблица содержит кириллицу и в наименовании столбцов и в полях. Момент: если из Q убрать DISTINCT, ADODB.Recordset возвращается непустым . Вопрос: почему реакция ADODB на ключевое слово DISTINCT кардинально отличается от реакции самого SQL Server? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2019, 17:29 |
|
DISTINCT в ADODB и в Management Studio
|
|||
---|---|---|---|
#18+
Может кому пригодится, ибо вроде как разобрался: Где-то вычитал на форумах, что ODBC-драйвера не умеют в DISTINCT запросы на стороне СУБД. Проблемы не только у меня с MS SQL Server, но у людей с Oracle. И да, к моему удивлению, оказалось, что запрос имеет свойство: выполняться на стороне клиента или выполняться на стороне СУБД. С выставленным свойством объекта Recordset .CursorLocation = adUseClient запрос вида "SELECT DISTINCT... " начал-таки возвращать строки. При этом время выполнения запроса раза в два-три выше аналогичного к таблице Excel. Это печально, господа. ADO существует с 1996 года, ODBC еще дольше, но ср*ный DISTINCT запрос не может быть исполнен силами СУБД. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2019, 10:47 |
|
DISTINCT в ADODB и в Management Studio
|
|||
---|---|---|---|
#18+
trigubovichaa, фигню говорите У меня все возвращается корректно. приведите скрипт, может Вы где-то что-0то не так сделали ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2019, 08:22 |
|
DISTINCT в ADODB и в Management Studio
|
|||
---|---|---|---|
#18+
trigubovichaaМожет кому пригодится, ибо вроде как разобрался: Где-то вычитал на форумах, что ODBC-драйвера не умеют в DISTINCT запросы на стороне СУБД. Проблемы не только у меня с MS SQL Server, но у людей с Oracle. И да, к моему удивлению, оказалось, что запрос имеет свойство: выполняться на стороне клиента или выполняться на стороне СУБД. С выставленным свойством объекта Recordset .CursorLocation = adUseClient запрос вида "SELECT DISTINCT... " начал-таки возвращать строки. При этом время выполнения запроса раза в два-три выше аналогичного к таблице Excel. Это печально, господа. ADO существует с 1996 года, ODBC еще дольше, но ср*ный DISTINCT запрос не может быть исполнен силами СУБД. я думаю ошибка у вас в коде ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2019, 14:49 |
|
DISTINCT в ADODB и в Management Studio
|
|||
---|---|---|---|
#18+
HandKottrigubovichaa, фигню говорите У меня все возвращается корректно. приведите скрипт, может Вы где-то что-0то не так сделали Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2019, 21:28 |
|
DISTINCT в ADODB и в Management Studio
|
|||
---|---|---|---|
#18+
trigubovichaa, У Вас возвращается тип курсора forward-only cursor для серверного курсора, а этот тип курсора всегда возвращает -1 для кол-ва записей автор The RecordCount property will return -1 for a forward-only cursor; the actual count for a static or keyset cursor; and either -1 or the actual count for a dynamic cursor, depending on the data source. Это не означает, что trigubovichaa В результате исполнения ADODB.Recordset возвращается пустой. ... Это печально, господа. ADO существует с 1996 года, ODBC еще дольше, но ср*ный DISTINCT запрос не может быть исполнен силами СУБД ... |
|||
:
Нравится:
Не нравится:
|
|||
06.09.2019, 08:26 |
|
DISTINCT в ADODB и в Management Studio
|
|||
---|---|---|---|
#18+
HandKot, благодарю: теперь я знаю, что авторIf a provider does not support the requested cursor type, it may return another cursor type. источник здесь . В моем случае провайдер SQLOLEDB на стороне сервера при запросе, содержащем DISTINCT , заменил тип курсора с adOpenKeyset на adOpenForwardOnly . При таком курсоре .RecordCount = -1 и такая удобная GetFields не работает. Действительно, результат возвращается (УРА!), но его нужно вытаскивать построчно. Тот же самый провайдер на стороне сервера при точно таком же запросе, но без ключевого слова DISTINCT , тип курсора не тронул ( ! ) и вернул целиком RecordSet со всеми плюшками. И это вызывает у меня, в силу скудных познаний в предмете, недоумение: "А чо мешает-то с дистинктом?!". При всем вышеописанном имеем еще один момент, подливающий масла к моему пылающему пердаку: провайдер Microsoft.Jet.OLEDB.4.0 на запросы с DISTINCT на стороне сервера может возвращать целый RecordSet. Какой при этом тип курсора использовался - для меня уже второстепенно. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2019, 00:22 |
|
|
start [/forum/topic.php?fid=60&msg=39856304&tid=2154884]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
37ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
others: | 266ms |
total: | 393ms |
0 / 0 |