Создайте запрос DELETE, выбрав из таблицы

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

По этой причине я решил дополнительно хранить все созданные записи в дополнительной таблице, где я храню:

  1. new таблицы, в которую была вставлена ​​новая запись
  2. имя поля, используемого для предложения where в операторе удаления
  3. id записи в ее таблице

Создайте запрос DELETE, выбрав из таблицы

Теперь я пытаюсь выбрать все записи из приведенной выше таблицы и использовать ее для создания запросов на удаление.

Можно ли это сделать в одном запросе?

SELECT * FROM AutomationTestingData AS atd 

DELETE FROM atd.TableName WHERE atd.DeleteByField = atd.RecordId

Будем признательны за любую помощь, с уважением.

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

GuidoG 10.04.2019 09:21

Привет, я думаю, вам нужно использовать EXECUTE и динамический запрос, построить курсор с помощью SELECT 'DELETE FROM' + atd.TableName + 'WHERE' + atd.DeleteByField + '= ' + atd.RecordId + ';'

Sanpas 10.04.2019 09:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
901
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

вы можете использовать этот синтаксис:

delete T1
from Table1 T1 join Table2.T2 on T1.SomeField=T2.SomeField
where Some Condition
Ответ принят как подходящий

Привет, если я понимаю все, что вы пытаетесь, я думаю, что это может ответить:

SET NOCOUNT ON;  

DECLARE  @query varchar(4000);  

PRINT '-------- Deleting rows --------';  

DECLARE deleting_cursor CURSOR FOR   
SELECT 'DELETE FROM ' + atd.TableName + ' WHERE ' + atd.DeleteByField + ' = ' + atd.RecordId + ';'
FROM AutomationTestingData AS atd 

OPEN deleting_cursor  

FETCH NEXT FROM deleting_cursor   
INTO @query  

WHILE @@FETCH_STATUS = 0  
BEGIN  

    EXEC(@Query)

    FETCH NEXT FROM deleting_cursor   
    INTO @query  
END   
CLOSE deleting_cursor;  
DEALLOCATE deleting_cursor;  

КУРСОР SQL: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/declare-cursor-transact-sql?view=sql-server-2017

ВЫПОЛНИТЬ динамический SQL Server: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/execute-transact-sql?view=sql-server-2017

Спасибо за ответ, не могли бы вы сказать мне, где вы объявляете «atd»?

Matthewek 10.04.2019 09:37

@Matthewek, да, извините, я пропал, у меня есть обновленный ответ.

Sanpas 10.04.2019 09:39

Это жизнеспособный способ сделать это полностью автоматическим. Одно улучшение: вам не нужно писать оператор удаления для каждой строки в объявлении, см. редактирование в моем ответе.

GuidoG 10.04.2019 09:42

Я получаю сообщение «Сообщение 245, уровень 16, состояние 1, строка 13. Преобразование не удалось при преобразовании значения varchar»; к типу данных int.' Попробую разобраться, еще раз спасибо за отличное решение.

Matthewek 10.04.2019 09:46

вам нужно преобразовать ` + adt.RecordId + ` вот так ` + convert (varchar (10), adt.RecordId) + `, чтобы исправить это

GuidoG 10.04.2019 09:49

Рассмотрите возможность изменения определения курсора, как в редактировании моего ответа, оно должно быть быстрее и не требует преобразований.

GuidoG 10.04.2019 09:50

Вы можете написать оператор удаления для каждой таблицы, например

delete from Company 
where  id in ( select RecordId from adt where adt.TableName = 'Company')

delete from PickListValues 
where  id in ( select RecordId from adt where adt.TableName = 'PickListValues')

Конечно, это не очень динамично, но все же быстрее, чем динамический sql и курсор.

Редактировать
ЕСЛИ вам нужен полностью автоматический режим, используйте dynamic sql, как предложил @pascalsanchez.

Я бы изменил курсор вот так

declare deleting_cursor cursor for
select 'delete from ' + adt.TableName + 
       'where ' + adt.DeleteByField + ' in (select RecordID from adt where adt.TableName = ''' + adt.TableName + ''')
from   AutomationTestingData AS atd 
group by adt.TableName, adt.DeleteByField

Это жизнеспособное решение, но, поскольку оно используется для «автоматизированного тестирования», я хотел бы максимально автоматизировать его :), поэтому мне не нужно каждый раз обновлять этот запрос новыми таблицами, как я понял. out, будет выбирать все из моей таблицы, используя java, создавая новый класс, который содержит все три поля, сортирует их и создает несколько DELETE FROM dbo." + tableName + " WHERE (" + whereColumn + " IN (" + ids +" )) Однако, спасибо

Matthewek 10.04.2019 09:32

Нет проблем, в этом случае вы также можете подумать о том, чтобы сделать это на сервере sql, используя курсор и динамический sql, как это было предложено @pascalsanchez.

GuidoG 10.04.2019 09:33

Другие вопросы по теме