|
Рекурсивный запрос (CTE) выдает ошибку в 2019
|
|||
---|---|---|---|
#18+
Есть sql-функция GetPhaseID, которая использует CTE запрос типа Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Следующий запрос стал выдавать ошибку на 2019 сервере: Код: sql 1. 2. 3. 4. 5.
На 2017 сервере все было нормально. В чем причина? Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2020, 12:32 |
|
Рекурсивный запрос (CTE) выдает ошибку в 2019
|
|||
---|---|---|---|
#18+
Ошибка, видимо, в 18й строке функции erp.[GetPhaseID] ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2020, 12:35 |
|
Рекурсивный запрос (CTE) выдает ошибку в 2019
|
|||
---|---|---|---|
#18+
urachins, Это не ошибка SQL. Это ошибка .NET внутри CLR. Может быть вызвана тем, что какие библиотеки недоставлены. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2020, 12:49 |
|
Рекурсивный запрос (CTE) выдает ошибку в 2019
|
|||
---|---|---|---|
#18+
Кстати, да, в SSMS запрос выполняется? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2020, 12:50 |
|
Рекурсивный запрос (CTE) выдает ошибку в 2019
|
|||
---|---|---|---|
#18+
Да, у меня выполняется без ошибки, у клиента - ошибка нашел что-то похожее, рекомендуют просто перекомпилировать эту функцию: https://dba.stackexchange.com/questions/256861/after-sql-restart-cte-causes-invalid-object-name-error-for-a-short-period-in-sq ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2020, 12:55 |
|
Рекурсивный запрос (CTE) выдает ошибку в 2019
|
|||
---|---|---|---|
#18+
Смог воспроизвести у себя на 2019 только когда меняю совместимость базы на 150 как у клиента (для 140 все нормально) Это бага MS Sql? ALTER DATABASE MYTest SET COMPATIBILITY_LEVEL = 150 select * from erp.ProjPhase as a where erp.[ GetPhaseID ](a.company, a.projectid, a.phaseid) <> '1' Msg 208, Level 16, State 1, Procedure GetPhaseID, Line 36 [Batch Start Line 12] Invalid object name 'parent_list'. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2020, 16:25 |
|
Рекурсивный запрос (CTE) выдает ошибку в 2019
|
|||
---|---|---|---|
#18+
Или делайте, чтобы работало (там накидали по ссылке воркэраундов), или отключайте инлайнинг без понижения compatibility_level: ALTER DATABASE SCOPED CONFIGURATION SET TSQL_SCALAR_UDF_INLINING = OFF; Подробности, как всегда, в документации . ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2020, 16:28 |
|
Рекурсивный запрос (CTE) выдает ошибку в 2019
|
|||
---|---|---|---|
#18+
Спасибо, по документации, действительно говорится, что во встроенный функциях CTE использовать нельзя The UDF does not contain references to Common Table Expressions (CTEs). Проблема в том, что по умолчанию при переходе на 2019 параметр базы будет TSQL_SCALAR_UDF_INLINING = ON то есть все функции будут рассматриваться как встраиваемые. Отключать его не хочется. Последние два вопроса 1) Можно проверить каждую существующую функцию, удовлетворяет ли она условиям на встраиваемость и если нет то в скриптах на их создание добавить хинт WITH INLINE = OFF , но этот хинт не поддерживается в ранних версиях. Можно ли сделать универсальный скрипт для любой версии ? 2) Почему после перекомпиляции функции в 2019 сервер уже не ругается? Хотя рекурсивные CTE там остались. Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2020, 19:15 |
|
Рекурсивный запрос (CTE) выдает ошибку в 2019
|
|||
---|---|---|---|
#18+
urachins, просто старайтесь не использовать скалярные функции в запросах. Рекурсивный запрос для дерева можно заменить например, на использование иерархического типа. Также создайте проект базы в VS, напишите тесты, выполняйте развертывание и тестирование. Сразу исчезнут многие неожиданности. Хотя это может быть и трудоёмко, если разработка не велась так с самого начала. Используйте системы версионирования кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2020, 21:13 |
|
Рекурсивный запрос (CTE) выдает ошибку в 2019
|
|||
---|---|---|---|
#18+
Да, согласен, спасибо, хотя в этом направлении мне пока не все понятно и многому надо учиться. Рекурсивный CTE использовал для простого обхода дерева снизу до корня, для подобных целей его, наверное, и придумали. По основному вопросу оказалось, что при переходе на (2019) с (2017) через простое восстановление базы sql для каждой функции сам выставляет новые параметры inline_type, is_inlineable, указывающие, может ли она быть встроенной или нет: SELECT inline_type, is_inlineable FROM sys.sql_modules where OBJECT_NAME(object_id) = 'GetPhaseID' Для большинства функций делает это правильно, типа, для простых - 1, для сложных - 0. Но именно для функций, использующих CTE он ошибается и ставит 1 (встраиваемая) и тогда при использовании ее в запросе вылезает ошибка. Если же функцию перекомпилировать, то sql правильно ее распознает и ставит в эти поля 0. Более того, в такой функции он не дает в скрипте на создание поставить хинт WITH INLINE = ON Пока вижу один вокэраунд - при переходе на 2019 заставлять запустить скрипты на пересоздание функций. Как-то можно это автоматизировать? клиентов много и каждый сам решает в какой момент перейти на 2019. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.08.2020, 12:55 |
|
Рекурсивный запрос (CTE) выдает ошибку в 2019
|
|||
---|---|---|---|
#18+
urachins, непростая задача, если вы поставщик ПО, то должны разработать способ обновления версий базы. Если она у вас вообще версионирована. Например, соберите два варианта скрипта обновления для очередного обновления, каждый из которых будет выполнен в зависимости от версии сервера, не который устанавливается. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.08.2020, 13:10 |
|
Рекурсивный запрос (CTE) выдает ошибку в 2019
|
|||
---|---|---|---|
#18+
urachins Да, согласен, спасибо, хотя в этом направлении мне пока не все понятно и многому надо учиться. Рекурсивный CTE использовал для простого обхода дерева снизу до корня, для подобных целей его, наверное, и придумали. По основному вопросу оказалось, что при переходе на (2019) с (2017) через простое восстановление базы sql для каждой функции сам выставляет новые параметры inline_type, is_inlineable, указывающие, может ли она быть встроенной или нет: SELECT inline_type, is_inlineable FROM sys.sql_modules where OBJECT_NAME(object_id) = 'GetPhaseID' Для большинства функций делает это правильно, типа, для простых - 1, для сложных - 0. Но именно для функций, использующих CTE он ошибается и ставит 1 (встраиваемая) и тогда при использовании ее в запросе вылезает ошибка. Если же функцию перекомпилировать, то sql правильно ее распознает и ставит в эти поля 0. Более того, в такой функции он не дает в скрипте на создание поставить хинт WITH INLINE = ON Пока вижу один вокэраунд - при переходе на 2019 заставлять запустить скрипты на пересоздание функций. Как-то можно это автоматизировать? клиентов много и каждый сам решает в какой момент перейти на 2019. при переходе на скл-2019 обратитесь в службу поддержки да и вообще сама идея смены версии без согласования с поддержкой выглядит странновато ... |
|||
:
Нравится:
Не нравится:
|
|||
14.08.2020, 16:39 |
|
|
start [/forum/topic.php?fid=46&fpage=51&tid=1685768]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
70ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 179ms |
0 / 0 |