#sql-server #tsql #stored-procedures
#sql-сервер #tsql #хранимые процедуры
Вопрос:
Долгое время просмотра, первый раз спрашивающий
В настоящее время я работаю над чем-то, где мне нужно удалять данные в двух таблицах на основе условий в двух разных таблицах. Я всего лишь новичок в SQL, и это было у меня все утро.
Два условия заключаются в том, что для GDPR в таблице клиентов установлено значение N и что дата платежа в таблице платежных транзакций превышает 30 дней
create proc MemberDelete
delete from ClientsPersonalInfo
from Clients, PaymentTransaction
where ClientsPersonalInfo.ClientID = Clients.ClientID and Clients.GDPR = 'N' and (select datediff(dd,PaymentDate,GETDATE()) from PaymentTransaction)>30
delete from GymCard
from Clients, PaymentTransaction
where GymCard.ClientID = Clients.ClientID and Clients.GDPR = 'N' and (select datediff(dd,PaymentDate,GETDATE()) from PaymentTransaction)>30
If @@rowcount <>1
rollback
else
Commit
Действительно не уверен, где я ошибаюсь с этим? Ошибка, которую я получаю, заключается в следующем: «Подзапрос вернул более 1 значения. Это не разрешено, когда подзапрос следует =, !=, <, <= , >, >= или когда подзапрос используется как выражение «.
Суть процедуры заключается в жестком удалении данных из ClientPersonalInfo и GymCard, если их идентификатор клиента подпадает под два условия в таблице Clients и PaymentTransaction. Это связано с тем, что клиент не поставил галочку в поле для GDPR, чтобы мы сохранили информацию, и что дата их последнего платежа превышает 30 дней.
Комментарии:
1. «Действительно не уверен, что я ошибаюсь в этом?» Что не так с тем, что у вас есть? Вы нам не говорите. Кроме того, вам давно пора перестать использовать этот древний синтаксис СОЕДИНЕНИЯ. Синтаксис соединения ANSI-92 существует уже почти 30 лет.
2. Образцы данных и желаемые результаты могли бы помочь. Также полезным было бы описание того, что вы хотите сделать.
3. Прошу прощения, я должен был вдаваться в подробности. При попытке выполнить его я получаю следующие ошибки. «Подзапрос вернул более 1 значения. Это не разрешено, когда подзапрос следует =, !=, <, <= , >, >= или когда подзапрос используется как выражение «. Что я хочу сделать, так это если идентификатор клиента соответствует обоим условиям в таблицах PaymentTransaction и Clients, я хочу удалить все данныеони находятся в таблицах ClientsPersonalInfo и GymCard.
4. какова связь между клиентами и PaymentTransaction? Это тоже ClientID?
5. НЕ пытайтесь зафиксировать транзакцию, которая не была запущена вашей процедурой. Процесс, который запускает транзакцию, должен нести (и, вероятно, предполагает, что он несет) эту ответственность и полагается на это для завершения (предположительно) более сложного процесса, частью которого является ваша процедура. Если это не ваш дизайн, то исправьте его.
Ответ №1:
Вы должны ПРИСОЕДИНИТЬСЯ к PaymentTransaction, используя ClientID.
Вам также необходимо ПРИСОЕДИНИТЬСЯ к GymCard с помощью PaymentTransaction.
create proc MemberDelete
delete from ClientsPersonalInfo
from Clients, PaymentTransaction
where
ClientsPersonalInfo.ClientID = PaymentTransaction.ClientID and
ClientsPersonalInfo.ClientID = Clients.ClientID and
Clients.GDPR = 'N' and (select datediff(dd,PaymentDate,GETDATE())
from PaymentTransaction
where
ClientsPersonalInfo.ClientID = PaymentTransaction.ClientID)>30
delete from GymCard
from Clients, PaymentTransaction
where
GymCard.ClientID = Clients.ClientID and
GymCard.ClientID = PaymentTransaction.ClientID and
Clients.GDPR = 'N' and (select datediff(dd,PaymentDate,GETDATE())
from PaymentTransaction
where
GymCard.ClientID = PaymentTransaction.ClientID)>30
If @@rowcount <>1
rollback
else
Commit
Комментарии:
1. Этот ответ определенно на правильном пути, но я хочу указать на пару вещей. Я не думаю, что вы можете откатить или зафиксировать транзакцию без «Begin Tran». Кроме того, переменная @@rowcount предоставит вам количество строк, связанных только с самым последним оператором.