|
Проблемы с INSERT INTO EXEC SP (MS SQL Server 2012 MSSQLEXPRESS)
|
|||
---|---|---|---|
#18+
Здравствуйте, форумчане ! Есть SP, которая по полученным параметрам делает выборку, сортировку и нумерацию записей из некоторой таблицы БД. Вот она: Код: sql 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.
Все работает отлично. Требуется создать SP, которая будет выбирать из НД, полученного вышеуказанной SP, нужную страницу Вот скрипт - контент для этой SP Код: sql 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.
При запуске выдает: Сообщение 556, уровень 16, состояние 3, строка 44 Ошибка при выполнении INSERT EXEC, поскольку хранимая процедура изменила схему целевой таблицы. Почитал, что такая ошибка возникает из-за особенностей очистки MS SQL Server хранилища ( https://support.microsoft.com/ru-ru/help/4465511/error-556-insert-exec-failed-stored-procedure-altered-table-schema) Также почитал о "подводных камнях Insert Exec" здесь: https://olontsev.ru/2016/05/insert-exec-behaviour/ Как избавиться от ошибки я так и не понял (видимо из-за "особенностей" автоперевода на сайте Microsoft) Решил пойти другим путем: использовать OPENROWSET, опыта работы с которым совсем не имею. Но возникла новая проблема: дело в том, что "базовая" SP требует параметры-строки. Попытка вставить их в строку для OpenRowset привела к тому, что вместо трех параметров - строк, OpenRowSet получает 7 и естественно опять ошибка. Как решить проблему ? Замена базовой SP на функцию невозможна из-за динамического SQL ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2020, 14:15 |
|
Проблемы с INSERT INTO EXEC SP (MS SQL Server 2012 MSSQLEXPRESS)
|
|||
---|---|---|---|
#18+
MsGuns, Код: sql 1.
в процедуре, которая пишет в эту же таблицу? даже страшно предположить, что вы там курите ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2020, 14:20 |
|
Проблемы с INSERT INTO EXEC SP (MS SQL Server 2012 MSSQLEXPRESS)
|
|||
---|---|---|---|
#18+
MsGuns, #tmp ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2020, 14:41 |
|
Проблемы с INSERT INTO EXEC SP (MS SQL Server 2012 MSSQLEXPRESS)
|
|||
---|---|---|---|
#18+
Спасибо огромное ! А ларчик просто открывался :) Дурные отрыжки копипасты :) Ну и замена постоянной таблицы на временную тоже.. Трава обычная :) Надо обойти кривости мсскл, в частности невозможность использования в UDF динамического SQL, а также вызова SP из UDF. Все приходится делать в хранимках. Таблица создается как временное хранилище для того, чтобы всунуть туда выборку и вернуть ее вовне. После чего таблица удаляется. Что-то типа курсора :) Т.к. все это в рамках одной транзакции, то конфликтов вроде как быть не должно. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2020, 15:02 |
|
Проблемы с INSERT INTO EXEC SP (MS SQL Server 2012 MSSQLEXPRESS)
|
|||
---|---|---|---|
#18+
MsGuns Спасибо огромное ! А ларчик просто открывался :) Дурные отрыжки копипасты :) Ну и замена постоянной таблицы на временную тоже.. Трава обычная :) Надо обойти кривости мсскл, в частности невозможность использования в UDF динамического SQL, а также вызова SP из UDF. Все приходится делать в хранимках. Таблица создается как временное хранилище для того, чтобы всунуть туда выборку и вернуть ее вовне. После чего таблица удаляется. Что-то типа курсора :) Т.к. все это в рамках одной транзакции, то конфликтов вроде как быть не должно. "кривой" мсскл грустно курит в углу бычки и наблюдает как чёткие девелоперы курят траву и обходят его "кривости" ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2020, 15:43 |
|
Проблемы с INSERT INTO EXEC SP (MS SQL Server 2012 MSSQLEXPRESS)
|
|||
---|---|---|---|
#18+
MsGuns, Код: sql 1.
да нет, же забористая у вас трава. Вы откуда образование разработчика СУБД получили - из Pascal или Basic? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2020, 17:11 |
|
Проблемы с INSERT INTO EXEC SP (MS SQL Server 2012 MSSQLEXPRESS)
|
|||
---|---|---|---|
#18+
>да нет, же забористая у вас трава. Вы откуда образование разработчика СУБД получили - из Pascal или Basic? 1. Какое отношение ЯП имеет к СУБД ? 2. Если речь идет о СУБД, то мой опыт такой: Clipper, Paradox, Interbase(Firebird), MS SQL, Oracle, PostgreSQL, MySQL Правда, экспертом ни в одной из этих СУБД не являюсь. Просто пришлось работать с этими дядьками. 3. Пилюля получена и съедена. А где эффект, т.е. где ссылка (хотя бы) на разъяснение каков я дурак ? Или плюнул и пошел ? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2020, 17:57 |
|
Проблемы с INSERT INTO EXEC SP (MS SQL Server 2012 MSSQLEXPRESS)
|
|||
---|---|---|---|
#18+
Читаем https://docs.microsoft.com/ru-ru/sql/relational-databases/user-defined-functions/create-user-defined-functions-database-engine?view=sql-server-ver15 Особенно п.5 "Ограничений". ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2020, 18:05 |
|
Проблемы с INSERT INTO EXEC SP (MS SQL Server 2012 MSSQLEXPRESS)
|
|||
---|---|---|---|
#18+
MsGuns, Я иронизирую потому, что вы используете процедурные методы при решении реляционных задач. В идеале решение надо подбирать таким, чтобы все данные находились в таблицах и то, что Вам нужно, можно было бы получить SQL запросом, не прибегая к "генератору запроса". Код: sql 1. 2.
такие запросы плохо работают при массовой нагрузке на сервер, хотя и допустимы при редких единичных выполнениях. Произвольная сортировка и нумерация строк довольно часто выполняется в клиентском приложении, т.к. это работает быстрее как с точки зрения извлечения данных, так и с точки зрения сортировки. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2020, 18:12 |
|
Проблемы с INSERT INTO EXEC SP (MS SQL Server 2012 MSSQLEXPRESS)
|
|||
---|---|---|---|
#18+
Исходная "таблица" - это что-то вроде Корпоративной телефонной Книги с массой дополнительных атрибутов. Вся эта "кухня" хранится не в одной таблице, конечно, и даже не в десяти. В итоге записей в этой книге несколько сот тысяч. Число пользователей приложения исчисляется тысячами в один момент времени. Выборка всей Книги не нужна в принципе - поэтому используются "фильтры" (Where), число которых весьма велико (более 20). Писать в UDF все эти кейсы - это ж... Тем более, что так и есть в настоящий момент. В результате UDF-ки огроменные и их дофига и больше. Я хочу несколько "облегчить" логику пусть даже ценою некоторой потери производительности. Проект и так слишком "тяжел" и на его сопровождение и развитие уходит до черта ресурсов (читай - денег). В конце концов докупить пару серверов много проще, чем найти квалифицированного программиста взамен ушедшего. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2020, 19:12 |
|
Проблемы с INSERT INTO EXEC SP (MS SQL Server 2012 MSSQLEXPRESS)
|
|||
---|---|---|---|
#18+
MsGuns Исходная "таблица" - это что-то вроде Корпоративной телефонной Книги с массой дополнительных атрибутов. Вся эта "кухня" хранится не в одной таблице, конечно, и даже не в десяти. В итоге записей в этой книге несколько сот тысяч. Число пользователей приложения исчисляется тысячами в один момент времени. Выборка всей Книги не нужна в принципе - поэтому используются "фильтры" (Where), число которых весьма велико (более 20). Писать в UDF все эти кейсы - это ж... Тем более, что так и есть в настоящий момент. В результате UDF-ки огроменные и их дофига и больше. Я хочу несколько "облегчить" логику пусть даже ценою некоторой потери производительности. Проект и так слишком "тяжел" и на его сопровождение и развитие уходит до черта ресурсов (читай - денег). В конце концов докупить пару серверов много проще, чем найти квалифицированного программиста взамен ушедшего. Замените udf на процедуры и делайте там свои динамические запросы. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2020, 19:16 |
|
Проблемы с INSERT INTO EXEC SP (MS SQL Server 2012 MSSQLEXPRESS)
|
|||
---|---|---|---|
#18+
msLex MsGuns Исходная "таблица" - это что-то вроде Корпоративной телефонной Книги с массой дополнительных атрибутов. Вся эта "кухня" хранится не в одной таблице, конечно, и даже не в десяти. В итоге записей в этой книге несколько сот тысяч. Число пользователей приложения исчисляется тысячами в один момент времени. Выборка всей Книги не нужна в принципе - поэтому используются "фильтры" (Where), число которых весьма велико (более 20). Писать в UDF все эти кейсы - это ж... Тем более, что так и есть в настоящий момент. В результате UDF-ки огроменные и их дофига и больше. Я хочу несколько "облегчить" логику пусть даже ценою некоторой потери производительности. Проект и так слишком "тяжел" и на его сопровождение и развитие уходит до черта ресурсов (читай - денег). В конце концов докупить пару серверов много проще, чем найти квалифицированного программиста взамен ушедшего. Замените udf на процедуры и делайте там свои динамические запросы. А вот Владислав Колосов придерживается противоположного мнения :) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2020, 20:13 |
|
|
start [/forum/topic.php?fid=46&fpage=69&tid=1686501]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 362ms |
total: | 497ms |
0 / 0 |