2009-06-05 2 views
2

"GO"가있는 경우에도 if 문이 참이라면 스크립트가 실행되지 않도록하려면 떨어져 있습니까? 우리의 놓을 때 한 번 이상 실행SQL Server : 실행중인 SQL 종료

이 일의 실제 목적은 테이블 스크립트/삽입을 만들 방지하는 것입니다
insert into table1 (col1, col2) value ('1', '2') 
GO 
if exists(select * from table1 where col1 = '1') 
    BEGIN 
    --Cause Script to fail 
    END 
GO 
insert into table1 (col1, col2) value ('1', '2') --Wont run 

가/삭제/업데이트 : 예를 들어

나는 다음과 같은 일을 할 DBA가 실행할 패키지

+2

'mssql'대신 'sqlserver'태그를 사용하십시오. 질문에 태그를 지정할 때 제안 사항을보십시오. 이름이 10보다 작은 태그는 이름이 잘못되었을 수 있습니다. 'mssql'은 다른 질문에 사용되지 않습니다. –

+1

SQL 문에서 GO 문이 필요한 이유를 이해할 수 없습니다. – Jeremy

+0

@ 제레미 : 예를 들어,이 시나리오에서 필요하지 않은 예제를 제공하는 것입니다.하지만 그렇게하고 싶다면 어떻게 멈추게할까요? 기본적으로 내가 얻으려고했던 것입니다.좋은 답변의 – Nic

답변

1

설명서에 따르면 심각도가 RAISEERROR()으로 전달 된 특정 값은 다양한 수준의 종료를 유발할 수 있습니다.

가장 관심있는 사람은 (당신이 SQL 관리 Studio 또는 유사한을 통해 스크립트를 실행하고, 파일의 후속 명령을 실행하려는 시도를 방지하려는 경우) 일 수 있습니다

심각도 수준 20에서 25까지는 치명적인 것으로 간주됩니다. 치명적인 심각도 수준이 발생하면 메시지를받은 후 클라이언트 연결이 종료되고 오류가 오류 및 응용 프로그램 로그에 기록됩니다.

+0

정말 그렇게하고 싶지 않습니다. 엔진에 의해 데이터베이스가 오프라인 상태가 될 수도 있습니다. 왜냐하면 ... col1에 '1'값이 있습니다! –

+0

@Jason : 이것은 내가 찾고있는 것입니다. 고마워요! – Nic

+0

@ Remus : 아무 것도 할 이유가 있습니다. 항상 실용적이지는 않지만 때로는 해결책이 실행 가능할 수도 있습니다. 내 상황에서는 이것이 완벽했습니다. – Nic

4

GO는 transact-sql 키워드가 아닙니다. 실제로 일반적인 SQL Server 도구에서 이해하는 배치 터미네이터입니다. 응용 프로그램에서 사용하면 응용 프로그램이 실패합니다.

왜 이런 식으로하지 않습니까?

IF NOT EXISTS (select * from table1 where col1 = '1') 
BEGIN 
    --Do Some Stuff 
END 

보다는 조건 이 조건 하지이 충족되는 경우에만 스크립트를 실행 만난 경우 스크립트를 중단합니다.

또는 proc에 코드를 래핑하고 RETURN을 사용하여 proc를 종료 할 수 있습니다.

+1

완벽한 예 : 사용자의 솔루션에 오류가 왜 -Explanation. - 일부 유용한 코드 - 추가/대체 솔루션 – JeffO

+0

@Guiness을 부여 anwer의 -Explanation :하지만이 실제로 * 대답은 * 사용자가 요구하는 일. 나는 실제로 Nic이 요청한 것이 가능한지 아닌지 알아 내고자 열심입니다. – Sung

+0

@Aaron는 : 대답 주셔서 감사하지만 내가 찾던 답변을 didnt한다. 우리 배치 (1)에 50 스크립트의 위쪽으로 우리는 이미 전송 되었기 때문에, 스크립트의 시작에서 종료 및 실행에 이르기까지 모든 것을 방지하려면. 스크립트가 두 번 이상 실행되는 것을 막는 데 도움이됩니다. 그것은 단지 우리의 전개 실천에 들어갑니다. 만약 내가 완벽한 것이지만 내 필요에 맞지 않는 칼럼을 추가하기 위해 뭔가를 찾고 있었다면. 다시 감사합니다. – Nic

0

상기 스크립트를 실행하기 위해 사용하는 도구를 지정하지 않았습니다. sqlcmd and osql tools have the -b parameter 'On error batch abort'은 정확히 묻는 것을 수행합니다. 단순히 '원인 스크립트 t 실패'를 RAISERROR("failure", 16, 1)으로 대체하십시오.

@ Jason 스크립트에서 16보다 높은 오류 수준을 사용하지 말 것을 적극 권장합니다. 하나는 18 이상의 레벨은 sysadmin 권한이 필요합니다. 두 번째로 그들은 에있는 관리 모니터링에서 모든 종류의 자동 응답을 트리거 할 수 있으며 페일 오버를 시작하거나 데이터베이스를 오프라인 상태로 만드는 것과 같은 과감한 조치를 포함하여 엔진 내부 에서조차도입니다. 그리고 마지막으로, 누군가가 실제 사건을 조사하는 경우 많은 시간 낭비를 초래할 것입니다. '충돌 전 한 시간의 하드웨어 고장, 음,이 문제를 살펴 봅시다.'

-1

goto를 사용하십시오. 못생긴 것처럼 들리지만 이것에 완벽하게 작동합니다.

편집 - nm,이 작동하지 않습니다. 꿈을 꾼 것 같았어야한다고 생각했을 때

+0

@hainstech : 레이블 (IF 문) 2 배치에서 (범위 만점) 표시되지 않습니다 때문에 GOTO가 작동하지 않고 제 2 배치는 여전히 실행 - GOTO 내가 생각하고 노력 최초의 일이었다, 그러나 didn를 일하지 마라. – Sung