[SQL] SQL 서버 - SQL 스크립트의 정지 또는 휴식 실행
SQLSQL 서버 - SQL 스크립트의 정지 또는 휴식 실행
방법은 "휴식"또는 "종료"명령과 같은 SQL 서버에서 SQL 스크립트의 즉시 정지 실행에 있습니까?
나는 그것이 삽입을하고 시작하기 전에 몇 가지 확인 및 검색을 수행하는 스크립트를 가지고 있고, 검증 또는 조회가 실패하면 나는 정지를 할 수 있습니다.
해결법
-
==============================
1.RAISERROR 방법
RAISERROR 방법
raiserror('Oh no a fatal error', 20, -1) with log
이것에 의해 실행되는 스크립트의 나머지 부분을 정지, 접속을 종료합니다.
가이 방식으로 작동하는 심각도 레벨 20 이상과 WITH LOG 옵션이 모두 필요합니다.
이 경우에도 예를 들어, GO 문, 함께 작동합니다.
print 'hi' go raiserror('Oh no a fatal error', 20, -1) with log go print 'ho'
당신에게 출력을 제공합니다 :
hi Msg 2745, Level 16, State 2, Line 1 Process ID 51 has raised user error 50000, severity 20. SQL Server is terminating this process. Msg 50000, Level 20, State 1, Line 1 Oh no a fatal error Msg 0, Level 20, State 0, Line 0 A severe error occurred on the current command. The results, if any, should be discarded.
'호'는 인쇄되지 않습니다 것을 알 수 있습니다.
주의 사항 :
참조 : http://www.mydatabasesupport.com/forums/ms-sqlserver/174037-sql-server-2000-abort-whole-script.html#post761334
NOEXEC 방법
GO 문으로 작품에 NOEXEC 설정되어 있는지 또 다른 방법. 이 스크립트의 나머지 부분은 스킵되도록합니다. 이 연결을 종료하지 않습니다,하지만 당신은 실행할 모든 명령 전에 다시 NOEXEC를 끄고해야합니다.
예:
print 'hi' go print 'Fatal error, script will not continue!' set noexec on print 'ho' go -- last line of the script set noexec off -- Turn execution back on; only needed in SSMS, so as to be able -- to run this script again in the same session.
-
==============================
2.그냥 RETURN을 사용하여 (이것은 내부와 외부 저장 프로 시저를 모두 작동합니다).
그냥 RETURN을 사용하여 (이것은 내부와 외부 저장 프로 시저를 모두 작동합니다).
-
==============================
3.당신이 SQLCMD 모드를 사용할 수있는 경우, 주문
당신이 SQLCMD 모드를 사용할 수있는 경우, 주문
:on error exit
실제로 스크립트를 중지 RAISERROR의 원인이됩니다 (콜론 포함). 예를 들면,
:on error exit IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SOMETABLE]') AND type in (N'U')) RaisError ('This is not a Valid Instance Database', 15, 10) GO print 'Keep Working'
의지 출력 :
Msg 50000, Level 15, State 10, Line 3 This is not a Valid Instance Database ** An error was encountered during execution of batch. Exiting.
및 배치가 중지됩니다. SQLCMD 모드가 켜져 있지 않은 경우 콜론에 대한 구문 분석 오류가 발생합니다. Unfortuantely,이 스크립트가 SQLCMD 모드없이 실행되는 것처럼 방탄 완전히 아니라, SQL Managment를 스튜디오 바로 과거를도 구문 분석 시간 오류를 바람! 당신이 명령 줄에서 실행하는 경우 그러나,이 괜찮습니다.
-
==============================
4.나는 RAISERROR- SQL은이 목적을 위해 사용할 수있는 IF 문이 사용하지 않을 것입니다. 당신의 검증 및 조회 및 설정 지역 변수를 수행 한 후 문이 삽입 조건부 만드는 경우의 변수의 값을 사용합니다.
나는 RAISERROR- SQL은이 목적을 위해 사용할 수있는 IF 문이 사용하지 않을 것입니다. 당신의 검증 및 조회 및 설정 지역 변수를 수행 한 후 문이 삽입 조건부 만드는 경우의 변수의 값을 사용합니다.
당신은 모든 검증 테스트의 변수의 결과를 점검 할 필요가 없다. 당신은 일반적으로 전달 된 모든 조건을 확인하는 하나의 플래그 변수를 사용하여이 작업을 수행 할 수 있습니다 :
declare @valid bit set @valid = 1 if -- Condition(s) begin print 'Condition(s) failed.' set @valid = 0 end -- Additional validation with similar structure -- Final check that validation passed if @valid = 1 begin print 'Validation succeeded.' -- Do work end
유효성 검사가 더 복잡하더라도, 당신은 단지 최종 검사 (들)에 포함 할 몇 가지 플래그 변수를 필요로한다.
-
==============================
5.SQL 2012+에서는 THROW를 사용할 수 있습니다.
SQL 2012+에서는 THROW를 사용할 수 있습니다.
THROW 51000, 'Stopping execution because validation failed.', 0; PRINT 'Still Executing'; -- This doesn't execute with THROW
MSDN에서 :
-
==============================
6.나는 모 아니면도 방식으로 스크립트를 실행 트랜잭션 성공적으로 솔루션을 온 / 오프에 NOEXEC을 확장했다.
나는 모 아니면도 방식으로 스크립트를 실행 트랜잭션 성공적으로 솔루션을 온 / 오프에 NOEXEC을 확장했다.
set noexec off begin transaction go <First batch, do something here> go if @@error != 0 set noexec on; <Second batch, do something here> go if @@error != 0 set noexec on; <... etc> declare @finished bit; set @finished = 1; SET noexec off; IF @finished = 1 BEGIN PRINT 'Committing changes' COMMIT TRANSACTION END ELSE BEGIN PRINT 'Errors occured. Rolling back changes' ROLLBACK TRANSACTION END
분명히 컴파일러가 오류이고 실행이 중지 된 경우에도 IF에서 @finished 변수를 "이해". 그러나,이 값은 실행이 중지되지 않은 경우에만 1로 설정된다. 따라서 나는 잘 커밋하거나 그에 따라 트랜잭션을 롤백.
-
==============================
7.필요한 경우는 WHILE 루프 및 사용 BREAK에 SQL 문을 래핑 수
필요한 경우는 WHILE 루프 및 사용 BREAK에 SQL 문을 래핑 수
WHILE 1 = 1 BEGIN -- Do work here -- If you need to stop execution then use a BREAK BREAK; --Make sure to have this break at the end to prevent infinite loop END
-
==============================
8.당신은 실행하여 GOTO 문의 흐름을 변경할 수 있습니다 :
당신은 실행하여 GOTO 문의 흐름을 변경할 수 있습니다 :
IF @ValidationResult = 0 BEGIN PRINT 'Validation fault.' GOTO EndScript END /* our code */ EndScript:
-
==============================
9.이 저장 프로 시저인가? 그렇다면, 당신이 바로 그러한 "반환 NULL"로 반품을 할 수 있다고 생각;
이 저장 프로 시저인가? 그렇다면, 당신이 바로 그러한 "반환 NULL"로 반품을 할 수 있다고 생각;
-
==============================
10.또한 refinig Sglasses 방법은, 상기 라인 SQLCMD 모드의 사용을 강요하며 어느 treminates scirpt SQLCMD 모드 사용 또는 사용하지 않는 경우 : 에러에 에러 종료에 출구를 CONTEXT_INFO는 상태를 추적하는 데 사용됩니다.
또한 refinig Sglasses 방법은, 상기 라인 SQLCMD 모드의 사용을 강요하며 어느 treminates scirpt SQLCMD 모드 사용 또는 사용하지 않는 경우 : 에러에 에러 종료에 출구를 CONTEXT_INFO는 상태를 추적하는 데 사용됩니다.
SET CONTEXT_INFO 0x1 --Just to make sure everything's ok GO --treminate the script on any error. (Requires SQLCMD mode) :on error exit --If not in SQLCMD mode the above line will generate an error, so the next line won't hit SET CONTEXT_INFO 0x2 GO --make sure to use SQLCMD mode ( :on error needs that) IF CONTEXT_INFO()<>0x2 BEGIN SELECT CONTEXT_INFO() SELECT 'This script must be run in SQLCMD mode! (To enable it go to (Management Studio) Query->SQLCMD mode)\nPlease abort the script!' RAISERROR('This script must be run in SQLCMD mode! (To enable it go to (Management Studio) Query->SQLCMD mode)\nPlease abort the script!',16,1) WITH NOWAIT WAITFOR DELAY '02:00'; --wait for the user to read the message, and terminate the script manually END GO ---------------------------------------------------------------------------------- ----THE ACTUAL SCRIPT BEGINS HERE-------------
-
==============================
11.난 당신이 시도의 catch 블록에 적절한 코드 블록을 포장하는 것이 좋습니다 것입니다. 그런 다음 원하는 경우 catch 블록에 침입하기 위해 (11)의 심각도로 RAISERROR 이벤트를 사용할 수 있습니다. 그냥 raiserrors를 원하지만 try 블록 내에서 실행을 계속 경우 낮은 심각도를 사용합니다.
난 당신이 시도의 catch 블록에 적절한 코드 블록을 포장하는 것이 좋습니다 것입니다. 그런 다음 원하는 경우 catch 블록에 침입하기 위해 (11)의 심각도로 RAISERROR 이벤트를 사용할 수 있습니다. 그냥 raiserrors를 원하지만 try 블록 내에서 실행을 계속 경우 낮은 심각도를 사용합니다.
이해가?
건배, 남자
[편집은 BOL 참조를 포함한다]
http://msdn.microsoft.com/en-us/library/ms175976(SQL.90).aspx
-
==============================
12.당신은 RAISERROR를 사용할 수 있습니다.
당신은 RAISERROR를 사용할 수 있습니다.
-
==============================
13.'GO'문에이 작품의 없음. 이 코드에 관계없이 심각도가 10 또는 11인지, 당신은 최종 PRINT 문을 얻는다.
'GO'문에이 작품의 없음. 이 코드에 관계없이 심각도가 10 또는 11인지, 당신은 최종 PRINT 문을 얻는다.
테스트 스크립트 :
-- ================================= PRINT 'Start Test 1 - RAISERROR' IF 1 = 1 BEGIN RAISERROR('Error 1, level 11', 11, 1) RETURN END IF 1 = 1 BEGIN RAISERROR('Error 2, level 11', 11, 1) RETURN END GO PRINT 'Test 1 - After GO' GO -- ================================= PRINT 'Start Test 2 - Try/Catch' BEGIN TRY SELECT (1 / 0) AS CauseError END TRY BEGIN CATCH SELECT ERROR_MESSAGE() AS ErrorMessage RAISERROR('Error in TRY, level 11', 11, 1) RETURN END CATCH GO PRINT 'Test 2 - After GO' GO
결과 :
Start Test 1 - RAISERROR Msg 50000, Level 11, State 1, Line 5 Error 1, level 11 Test 1 - After GO Start Test 2 - Try/Catch CauseError ----------- ErrorMessage -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Divide by zero error encountered. Msg 50000, Level 11, State 1, Line 10 Error in TRY, level 11 Test 2 - After GO
이 일을하는 유일한 방법은 GO 문없이 스크립트를 작성하는 것입니다. 때때로 그것은 간단합니다. 때로는 매우 어렵습니다. (@error <> 0 BEGIN IF와 같은 사용 뭔가 ....)
-
==============================
14.여기 RETURN 모든 시간, 절차 스크립트 또는 저장 작업을 사용하여
여기 RETURN 모든 시간, 절차 스크립트 또는 저장 작업을 사용하여
그렇지 않으면 오픈 커밋되지 않은 트랜잭션이 발생합니다 즉시 반환, 당신이 하나 있다면 당신이 트랜잭션을 롤백 확인
-
==============================
15.이것은 내 솔루션했다 :
이것은 내 솔루션했다 :
...
BEGIN raiserror('Invalid database', 15, 10) rollback transaction return END
-
==============================
16.당신은 GOTO 문을 사용할 수 있습니다. 이 시도. 이것은 당신을 위해 전체를 사용합니다.
당신은 GOTO 문을 사용할 수 있습니다. 이 시도. 이것은 당신을 위해 전체를 사용합니다.
WHILE(@N <= @Count) BEGIN GOTO FinalStateMent; END FinalStatement: Select @CoumnName from TableName
-
==============================
17.답에 대한 들으!
답에 대한 들으!
RAISERROR는 () 잘 작동하지만, 그렇지 않으면 스크립트가 오류없이 계속 return 문을 잊지 말아야! 필요한 경우 물론 롤백을 수행 (hense RAISERROR는 "인 throwError";-)되지 않습니다)!
RAISERROR () 뭔가 잘못 갔다 스크립트를 실행하는 사람에게 좋다.
-
==============================
18.당신은 단순히 관리 Studio에서 스크립트를 실행하고, 첫 번째 오류에 정지 실행 또는 롤백 거래 (사용 된 경우)을하려는 경우 가장 좋은 방법 I의 이해 할수는 시도의 catch 블록을 사용 (SQL 2005 이후)입니다. 스크립트 파일을 실행하는 경우이 관리 스튜디오에서 잘 작동합니다. 저장된 프로 시저 항상 잘으로 사용할 수 있습니다.
당신은 단순히 관리 Studio에서 스크립트를 실행하고, 첫 번째 오류에 정지 실행 또는 롤백 거래 (사용 된 경우)을하려는 경우 가장 좋은 방법 I의 이해 할수는 시도의 catch 블록을 사용 (SQL 2005 이후)입니다. 스크립트 파일을 실행하는 경우이 관리 스튜디오에서 잘 작동합니다. 저장된 프로 시저 항상 잘으로 사용할 수 있습니다.
-
==============================
19.위로 하루에 우리가 최고 일 ... 다음을 사용 :
위로 하루에 우리가 최고 일 ... 다음을 사용 :
RAISERROR ('Error! Connection dead', 20, 127) WITH LOG
from https://stackoverflow.com/questions/659188/sql-server-stop-or-break-execution-of-a-sql-script by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] JSON에 ResultSet의 대부분의 효율적인 변환? (0) | 2020.04.03 |
---|---|
[SQL] 두 개의 SELECT 문 결과를 가입 (0) | 2020.04.03 |
[SQL] 쿼리에 의해 덤프 MYSQL (0) | 2020.04.03 |
[SQL] OPTION (RECOMPILE)는 항상 빠른입니다; 왜? (0) | 2020.04.03 |
[SQL] 단일 쿼리에 삽입 여러 행에 대한 MySQL의 ON DUPLICATE KEY의 UPDATE (0) | 2020.04.03 |