2009-01-21 3 views
34

SQL Server Management Studio에서 파괴 쿼리 (예 : DELETE 또는 UPDATE)를 작성할 때 실제로 쿼리를 실행하지 않고도 쿼리 결과를 미리 볼 수 있기를 바랍니다. 아주 편리하게 액세스 할 수 있지만, SQL을 손으로 코딩하는 것을 선호합니다. 슬프게도, Access는 매우 가난합니다.파괴 SQL 쿼리는 어떻게 미리 볼 수 있습니까?

그래서 제 질문은 두 가지이다 :

  1. 는 SSMS를위한 추가 기능, 또는도 파괴 쿼리의 결과를 미리 볼 수 있습니다 좋은 SQL 손으로 코딩 시설이 완비 된 별도의 도구가 있습니까 , Access와 비슷한가?

  2. "손으로"미리보기를 수행하는 데 필요한 기술이나 모범 사례가 있습니까? 예를 들어 어떻게 든 거래를 사용합니까?

은 이런 종류의 일을하는 것이 근본적으로 중요하다는 것을 나에게 보인다 아직 나는 (나는 아마 잘못된 일을 찾고 있어요 Google을 통해 아무것도 찾을 수없는 것 -이에 정말 무지입니다 문제). 현재 나는 털이 많은 벨트를 사용하고 선택/삭제/업데이트 라인에 주석을 달고 라인을 백업하고 백업을 확실히하는 방법을 중괄호로 사용하고 있습니다. 더 나은 방법이 있어야합니다.

아무도 도와 줄 수 있습니까?

+0

http://stackoverflow.com/questions/281339/confirm-before-delete-update-in-sql-management -studio – Rockcoder

답변

51

난 이후 SQL Server 2008의 존재 OUTPUT 절을 사용

OUTPUT Clause (Transact-SQL)

뭔가 같은 ...

BEGIN TRANSACTION 

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

ROLLBACK TRANSACTION 

삽입하고 업데이트 역시 '삽입'테이블을 사용할 수 있습니다. MSDN 기사에서 다 다루고 있습니다.

편집 : SELECT의 다른 제안은 다음 실제로 모두 함께한다는 것을 제외하고는 트랜잭션 내에서 DELETE처럼

이입니다. 따라서 트랜잭션을 열고, OUTPUT 절을 사용하여 삭제/삽입/업데이트하고, 변경된 사항은 ALSO가 수행 한 작업을 출력하는 동안 이루어집니다. 그런 다음 롤백하거나 커밋하도록 선택할 수 있습니다. 나는 항상 다음과 같은 것을 할 내 팀을 요청할 수 있도록

+0

멋진, 그게 내가 한 것. 고맙습니다. :) –

+0

당신은 환영합니다 :) – MatBailie

+0

나는 데이터를 변경하지 않고도 결과를 볼 수 있기 때문에 Kevin의 솔루션을 선호합니다. 100000 레코드를 선택하면 100000 레코드를 삭제하는 것보다 데이터베이스 성능이 훨씬 뛰어납니다. 삭제 된 후 롤백 된 결과가 출력됩니다. – HLGEM

2

트랜잭션 컨텍스트에서 트랜잭션을 커밋하기 전에 언제든지 변경 내용을 롤백 할 수 있습니다. (명시 적 트란 커밋 또는 조건이 발생하는 경우에 그 암시 적 트랜잭션을 커밋하기 위해 서버의 원인이됩니다 호출하여) ...

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 
22

가 내 데이터베이스에이 일을 다른 사람의 두려움에 살고있는이 방법으로

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 키를 치면를 (그것을 한!) 당신은 아무 변화도 없을거야. SQL 문 끝에서 SELECT 부분을 강조 표시하여 어떤 레코드가 변경 될지 (그리고 몇 개가되는지) 확인할 수 있습니다. 그런 다음 BEGIN TRAN 및 전체 Delete 문을 강조 표시하고 실행하십시오. 예상 한 수의 레코드를 삭제하는 경우 COMMIT TRAN을 강조 표시하고 실행하십시오. 아무렇지도 않게 보이면 ROLLBACK TRAN을 강조 표시하고 실행하십시오.

나는 UPDATE 또는 DELETE 문을 사용하여이 작업을 수행합니다. 그것은 몇 번 나를 구원 받았지만, 항상 마음의 평화를 제공합니다.

+0

나는 추가 안전을 위해 DELETE와 SELECT를 반대 방향으로 놓을 것입니다. –

+2

나열된 순서대로 수행하는 이유는 BEGIN TRAN과 DELETE 문을 함께 강조 할 수 있기 때문입니다. DELETE가 주석 처리 된 경우 별도로 처리해야하지만 이는 개발자의 기본 설정입니다. 의견을 보내 주셔서 감사합니다. –

+3

누군가가 COMMIT를 잊어 버릴 때까지이 모든 것이 정상적으로 작동하고 다른 사용자를 차단하게됩니다. 그 일이 너무 자주 일어나는 것을 보았으므로이 전략을 사용할 때는주의하십시오. –

1

삭제 될 내용을보고 싶을 때 "삭제"문을 "선택 *"으로 변경합니다. 나는 이것을 잠그는 것에 대해 걱정할 필요가 없기 때문에 트랜잭션을 사용하는 것보다 맘에 든다.

+1

나는 언제나 어떤 방식 으로든 거래하려고 노력한다. 그냥 넣으세요. where 절을 제외한 모든 것을 강조 표시하고 f5를 누른 다음 빈 커피 머그를 멍하니 응시하는 것처럼 ... – MatBailie

4

삭제하는 경우 :

BEGIN TRANSACTION 

    DELETE FROM table1 
    OUTPUT deleted.* 
    WHERE property1 = 99 

ROLLBACK TRANSACTION 

가 삽입/갱신 할 때 :

BEGIN TRANSACTION 

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

ROLLBACK TRANSACTION 
관련 문제