Как мне просмотреть деструктивный SQL-запрос? - PullRequest
37 голосов
/ 21 января 2009

При написании деструктивных запросов (например, DELETE или UPDATE) в SQL Server Management Studio я всегда чувствую, что хочу просмотреть результаты запроса, фактически не выполняя его. Доступ очень удобно позволяет вам сделать это, но я предпочитаю кодировать мой SQL вручную, что, к сожалению, очень плохо для Access.

Итак, мой вопрос двоякий:

  1. Существует ли надстройка для SSMS или отдельный инструмент, оснащенный хорошими средствами ручного кодирования SQL, которые также могут предварительно просмотреть результат деструктивного запроса, аналогичного Access?

  2. Существуют ли какие-либо приемы или рекомендации для предварительного просмотра "от руки"; например, как-то использовать транзакции?

Мне кажется, что делать подобные вещи принципиально важно, но, тем не менее, я не могу найти что-либо через Google (возможно, я просто ищу не ту вещь - я ужасно не осведомлен в этом вопросе). В настоящее время я использую довольно сложный подход, заключающийся в комментировании и выделении / удалении / обновлении строк, а также в создании резервных копий. Должен быть лучший способ, конечно?

Может кто-нибудь помочь?

Ответы [ 5 ]

52 голосов
/ 21 января 2009

Я бы использовал предложение OUTPUT, присутствующее в SQL SERVER 2008 и далее ...

Предложение OUTPUT (Transact-SQL)

Что-то вроде ...

BEGIN TRANSACTION

DELETE [table] OUTPUT deleted.* WHERE [woof] 

ROLLBACK TRANSACTION

INSERT и UPDATE также могут использовать таблицу «вставлен». Статья MSDN охватывает все это.

EDIT:

Это так же, как другие предложения SELECT, а затем DELETE внутри транзакции, за исключением того, что он фактически делает оба вместе. Таким образом, вы открываете транзакцию, удаляете / вставляете / обновляете с помощью предложения OUTPUT, и изменения вносятся при ТАКЖЕ выводить то, что было сделано. Затем вы можете откатиться или зафиксировать.

24 голосов
/ 21 января 2009

Я боюсь, что кто-то сделает это с моими базами данных, поэтому я всегда прошу свою команду сделать что-то вроде следующего:

BEGIN TRAN
 
DELETE FROM X
-- SELECT * FROM X
FROM Table A as X JOIN Table B ON Blah blah blah
WHERE blah blah blah
 
ROLLBACK TRAN
COMMIT TRAN

Таким образом, если вы случайно нажмете F5 (сделали это!), Вы не внесете никаких изменений. Вы можете выделить часть SELECT в конце оператора SQL, чтобы увидеть, какие записи будут изменены (и сколько). Затем выделите BEGIN TRAN и весь оператор Delete и запустите его. Если вы удалили столько же записей, сколько ожидали, выделите COMMIT TRAN и запустите его. Если что-то выглядит странно, выделите ROLLBACK TRAN и запустите его.

Я делаю это с любым оператором UPDATE или DELETE. Это спасло меня пару раз, но ВСЕГДА обеспечивает душевное спокойствие.

6 голосов
/ 18 августа 2015

При удалении:

BEGIN TRANSACTION

   DELETE FROM table1 
   OUTPUT deleted.*
   WHERE property1 = 99 

ROLLBACK TRANSACTION

При обновлении / вставке:

BEGIN TRANSACTION

   UPDATE table1
   SET table1.property1 = 99
   OUTPUT inserted.*

ROLLBACK TRANSACTION
2 голосов
/ 21 января 2009

Когда вы находитесь в контексте транзакции, вы можете откатить изменения в любое время до совершения транзакции. (Либо путем явного вызова commit tran, либо при возникновении условия, которое заставит сервер неявно зафиксировать транзакцию)

create table x (id int, val varchar(10))

insert into x values (1,'xxx')
begin tran

delete from x
select * from x

rollback tran
select * from x
1 голос
/ 21 января 2009

Когда я хочу посмотреть, что будет удалено, я просто изменяю оператор «delete» на «select *». Мне это нравится больше, чем при использовании транзакции, потому что мне не нужно беспокоиться о блокировке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...