Вопрос по UpdateSelect к разработчикам базовой системы Creatio
Зачем в классе Terrasoft.DB.MSSql.MSSqlEngine в методе BuildConditionSqlText(StringBuilder sb, UpdateSelect query) вызов метода ReplaceUpdateTargetAliasWithName(QueryCondition condition, string alias, string name) ?
Класс генерирует неправильный запрос в БД:
var us =
new UpdateSelect(_userConnection, "Contact", "c")
.Set("Name", Column.Parameter("Andrew Baker (sample) + 1"))
.From("Contact", "c")
.InnerJoin("Account").As("a").On("a", "Id").IsEqual("c", "AccountId")
.Where("a", "Web").IsEqual(Column.Parameter("ac.com"))
.And("c", "Id").IsNotEqual(Column.Parameter(Guid.NewGuid()))
as UpdateSelect;
UPDATE [dbo].[Contact]
SET
[Name] = N'Andrew Baker (sample) + 1'
FROM
[dbo].[Contact] [c]
INNER JOIN [dbo].[Account] [a] ON ([a].[Id] = [c].[AccountId])
WHERE
[a].[Web] = N'ac.com'
AND [Contact].[Id] <> '{19812101-C7A9-4DED-BD44-F8973A98D746}'Результат выполнения:
![]()
При этом если бы упомянутый выше метод не вызывался, то запрос был бы верным:
![]()
Нравится
Владислав, добрый день!
Прошу уточнить, при каких условиях у вас генерируется этот запрос?
Владислав, проблема в самом запросе, вы пытаетесь задать один и тот же алиас как целевой таблице так и источнику. В вашем случае запрос должен выглядеть так:
var us =
new UpdateSelect(UserConnection, "Contact", "c")
.Set("Name", Column.Parameter("Andrew Baker (sample) + 2"))
.From("Contact", "ca")
.InnerJoin("Account").As("a").On("a", "Id").IsEqual("ca", "AccountId")
.Where("a", "Web").IsEqual(Column.Parameter("ac.com"))
.And("ca", "Id").IsNotEqual(Column.Parameter(Guid.NewGuid()))
as UpdateSelect;
Сам метод ReplaceUpdateTargetAliasWithName добавлен не просто так, он необходим для правильного построения запросов.