Member 11239384 Ответов: 2

Как удалить его одним нажатием кнопки?


У меня есть хранимая процедура с двумя операторами delete
удалить * от арендатора, когда арендатор-ИД =@арендатор -ИД
удалить * из аренды, где tenant-id =@tenant-id

проблема в том, что я должен дважды нажать кнопку Удалить в своем приложении, чтобы выполнить хранимую процедуру.

Что я уже пробовал:

удалить арендатора,договор аренды с арендатором внутреннее соединение по аренде, по которому арендатор.арендатор-идентификатор=лизинга.арендатор-ИД

но я получаю ошибку неправильного синтаксиса перед ','

F-ES Sitecore

Вы можете выполнить несколько команд my используя точку с запятой

удалить из таблицы 1; удалить из таблицы 2

Однако если вам нужно выполнить несколько команд, вам, вероятно, лучше использовать хранимую процедуру.

2 Ответов

Рейтинг:
16

OriginalGriff

Вы не можете использовать DELETE для удаления из двух таблиц - вы можете в MySql, но не в SQL Server - поэтому, когда вы попробовали второй код, вы получили синтаксическую ошибку.

Проблема "дважды нажать кнопку" вряд ли будет проблемой SQL - вам нужно посмотреть на свой код C# и точно увидеть, что он делает для выполнения хранимой процедуры.

И кстати: не используйте дефисы в именах столбцов: хотя вы можете, это плохая идея, так как дефис завершит имя столбца, когда вы попытаетесь его использовать, если только вы не окружите его квадратными скобками каждый раз, когда используете его, и даже не думайте использовать имена параметров с дефисами в названиях столбцов.:

DELETE * FROM Tenant WHERE [Tenant-ID]=@TenantID


Member 11239384

хорошо а как насчет выбора из обеих таблиц после ввода идентификатора арендатора на стороне приложения он отображает первую строку независимо от того что я ввожу в качестве идентификатора

OriginalGriff

Как, по-вашему, я могу это узнать, не имея доступа ни к вашему коду, ни к вашим данным? @смеяться:

Что вы пытались выяснить? Что показал отладчик?

Рейтинг:
10

Mike V Baker

На первый взгляд кажется, что ваш Теннант и ваша аренда связаны родителем с ребенком соответственно. Первая мысль, которая у меня есть, - это никогда, никогда не удалять эти вещи. В какой-то момент вам захочется вернуться к ним. Сколько договоров аренды было расторгнуто в прошлом году? Сколько людей не выполнили свои обязательства по аренде? Сколько раз пользователь программы ошибался и вводил договор аренды, когда он не должен был этого делать? Нет... отметьте договор аренды как расторгнутый, просроченный, недействительный, что угодно. Не удаляйте его. Особенно при работе с клиентами, которые могут в какой-то момент позвонить и сказать: "Эй, я заплатил дважды в прошлом месяце и хочу вернуть деньги".

Однако! Если вы действительно хотите удалить его, то ваша хранимая процедура может удалить несколько строк в отдельных строках. Или вы можете создать связи в базу данных каскадное удаление и обновление каскада. Sql Server позаботится об очистке связанных записей, вы удалите только родительские. Каскад - это вариант внешнего ключа, по умолчанию это не действие, но вы можете изменить его на каскад.

Общий синтаксис
Изменить таблицу дочерней таблицы с Регистрация добавить ограничение [FK_ChildTable_ParentTable] внешний ключ(атрибутом parentId) ссылки ParentTable(атрибутом parentId) на обновление каскада на удаление каскад

Ваш конкретный случай
ALTER TABLE Lease WITH CHECK ADD CONSTRAINT [FK_Lease_Tennant] FOREIGN KEY(tennant_id) REFERENCES Tennant(tennant_id) ON UPDATE CASCADE ON DELETE CASCADE

Ваш ИП должен был бы только удалить Теннанта. Вы можете настроить аналогичные отношения для работы с другими таблицами, платежами и так далее. Я должен повторить первоначальную мысль, это не те вещи, которые вы должны удалить. Когда-нибудь они тебе снова понадобятся, обещаю. Кроме того, возвращаясь к каскадным отношениям, было много споров о том, ухудшает ли это производительность или нет. Если вы работаете с таблицами с сотнями тысяч записей, то следует соблюдать осторожность.

[Обновление] я чуть не забыл упомянуть. Если у вас есть настроенный внешний ключ, который связывает арендатора с арендой, а аренда связывается с арендатором *без настройки каскада, то вы не можете сначала удалить родительскую запись. Вы должны удалить договор аренды, а затем вы можете удалить арендатора. Это связано с тем, что ограничение в аренде требует присутствия соответствующего арендатора.

ХТХ,
Майк