|
![]() |
#1 |
Участник
|
Ошибка БД при обновлении контейнерного поля
Добрый день.
Возникает ошибка обновления записи после проставления нового значения в контейнерное поле. При условии, что выбирается запись вместе с приджоиниными таблицами. Пример: Table1 у которой есть поле Field1 типа Container. X++: Table1 table1, table1join; // может быть любая другая таблица ; ttsBegin; select firstOnly forUpdate table1 join TableId from table1join; //exists join, выборка полей ограничена или нет - не важно // where может быть или отсутствовать - не важно table1.Field1 = [123]; table1.update(); ttsCommit; Оператор SQL: UPDATE TABLE1 SET FIELD1=<n/a>,RECVERSION=идентификатор WHERE (((DATAAREAID=N'тут компания') AND (RECID=идентификатор)) AND (RECVERSION=идентификатор)) Ошибка: Описание ошибки SQL: [Microsoft][SQL Native Client][SQL Server]Неправильный синтаксис около конструкции "<". Помогает выбор записи без джоина. Этому есть объяснение? Почему <n/a>? Последний раз редактировалось Товарищ ♂uatr; 28.03.2019 в 11:44. |
|
![]() |
#2 |
Участник
|
Цитата:
Сообщение от Товарищ ♂uatr
![]() Добрый день.
Возникает ошибка обновления записи после проставления нового значения в контейнерное поле. При условии, что выбирается запись вместе с приджоиниными таблицами. Пример: Table1 у которой есть поле Field1 типа Container. X++: Table1 table1, table1join; // может быть любая другая таблица ; ttsBegin; select firstOnly forUpdate table1 join TableId from table1join; //exists join, выборка полей ограничена или нет - не важно // where может быть или отсутствовать - не важно table1.Field1 = [123]; table1.update(); ttsCommit; Оператор SQL: UPDATE TABLE1 SET FIELD1=<n/a>,RECVERSION=идентификатор WHERE (((DATAAREAID=N'тут компания') AND (RECID=идентификатор)) AND (RECVERSION=идентификатор)) Ошибка: Описание ошибки SQL: [Microsoft][SQL Native Client][SQL Server]Неправильный синтаксис около конструкции "<". Помогает выбор записи без джоина. Этому есть объяснение? Почему <n/a>? |
|
![]() |
#3 |
Участник
|
Цитата:
Запрос имеет исключительно демонстративный характер - описывает суть проблемы. В комментариях к нему сказано, что добавление where условия на результат не влияет. Можете сами проверить where table1.RecId == table1join.RecId, например. |
|
![]() |
#4 |
Banned
|
Смущает table1.Field1 = [123];
Я бы сделал container con = [123]; table1.Field1 = con; |
|
![]() |
#5 |
Участник
|
А что за окружение (версия DAX, SQL)?
X++: static void Job4(Args _args) { Table2 table2, table2join; ; ttsBegin; select firstOnly forUpdate table2 join TableId from table2join; table2.Field1 = [123]; table2.update(); ttsCommit; } |
|
![]() |
#6 |
Участник
|
Цитата:
Проблема была выявлена в ходе копирования значения поля одного рекорда в другой. Цитата:
Сообщение от Raven Melancholic
![]() А что за окружение (версия DAX, SQL)?
X++: static void Job4(Args _args) { Table2 table2, table2join; ; ttsBegin; select firstOnly forUpdate table2 join TableId from table2join; table2.Field1 = [123]; table2.update(); ttsCommit; } В моем случае идентичная среда: DAX2009 5.0.1500.6491 и Microsoft SQL Server 2008 R2(SP3). Последний раз редактировалось Товарищ ♂uatr; 30.03.2019 в 21:14. |
|
![]() |
#7 |
Banned
|
Не соглашусь. Здесь нельзя полагаться на логику.
table1.Field1 += [123] уже может работать не так как table1.Field1 = [123] В любом случае что с присвоением контейнера что присвоением .NET типов сразу надо пробовать через обьявление переменной при возникновении ошибок. Как там работает интерпретатор только одному ему известно. Понятно что по логике раз без join работает то типа можно но там тоже человеки на сях писали и могли отчебучить все что угодно. |
|
![]() |
#8 |
Участник
|
Цитата:
X++: delete_from table2;
table2.clear();
table2.insert();
table2.insert();
table2.insert(); Профайлер MS SQL все команды поймал, только что именно пришло не знаю - там были плейсхолдеры (@P1...), а не литералы. |
|