SSMS가 SQLCMD 모드를 활성화 / 비활성화하도록 스크립트에서 사용할 수있는 지시문과 같은 것이 있습니까?
답변
지금까지 말씀 드린대로 “ta way”는 없습니다.
하지만 한 가지 스크립트 헤더에 빠른 검사를 포함하여 SQLCMD 모드가 켜져 있는지 확인하고 그렇지 않은 경우 스크립트를 종료하는 것입니다.
:setvar DatabaseName "MyDatabase" GO IF ("$(DatabaseName)" = "$" + "(DatabaseName)") RAISERROR ("This script must be run in SQLCMD mode. Disconnecting.", 20, 1) WITH LOG GO -- The below is only run if SQLCMD is on, or the user lacks permission to raise fatal errors IF @@ERROR != 0 SET NOEXEC ON GO PRINT "You will only see this when SQLCMD mode is on" -- Rest of script goes here GO SET NOEXEC OFF GO
심각도 20이 사용되는 이유는 나중에 스크립트에 GO
배치 종료자가 있어도 더 이상 스크립트 코드가 실행되지 않도록 연결을 즉시 종료하는 경향이 있습니다.
시스템 문제를 나타내며 치명적인 오류입니다. 즉, 문 또는 일괄 처리를 실행하는 데이터베이스 엔진 작업이 더 이상 실행되지 않습니다. 작업은 발생한 사항에 대한 정보를 기록한 다음 종료됩니다. 대부분의 경우 데이터베이스 엔진의 인스턴스도 종료 될 수 있습니다 .이 경우 문제에 따라 em, 응용 프로그램이 다시 연결되지 않을 수 있습니다.
이 범위의 오류 메시지는 동일한 데이터베이스의 데이터에 액세스하는 모든 프로세스에 영향을 미칠 수 있으며 데이터베이스 또는 개체가 손상되었음을 나타낼 수 있습니다. 심각도 수준이 19 ~ 24 인 오류 메시지는 오류 로그에 기록됩니다.
설명
답변
아니요.
하지만 항상 SQLCMD 모드에서 실행할 수 있으며 T-SQL을 사용할 수 있습니다.
SQLCMD 명령과 Transact-SQL을 명확하게 구분하려면 모든 SQLCMD 명령에 콜론 (:) 접두어를 붙여야합니다.
댓글
- SQL Server 2012/2014/2016에도 여전히 유효합니까?
- @ hot2use : 예, 나 ' 2014/2016에 사용
SET NOEXEC ON
는 스크립트의 다른 항목이 실행되는 것을 방지하기위한 추가 안전 조치입니다.:setvar
때문에 기본적으로incorrect syntax near ':'
가 표시됩니다 …RAISERROR
심각도 수준 20 (이상)은 SQL에서 치명적인 오류로 간주되어 연결이 즉시 끊어 지므로 더 이상 배치가 없습니다 (SET NOEXEC ON
)가 실행됩니다.NOEXEC
문이있는 이유는 실행중인 사용자에게sysadmin
/ 권한은 치명적인 오류를 발생시키는 데 필요합니다.