스크립트 내에서 SQLCMD 모드를 활성화 할 수 있습니까?

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 배치 종료자가 있어도 더 이상 스크립트 코드가 실행되지 않도록 연결을 즉시 종료하는 경향이 있습니다.

심각도 20-24 :

시스템 문제를 나타내며 치명적인 오류입니다. 즉, 문 또는 일괄 처리를 실행하는 데이터베이스 엔진 작업이 더 이상 실행되지 않습니다. 작업은 발생한 사항에 대한 정보를 기록한 다음 종료됩니다. 대부분의 경우 데이터베이스 엔진의 인스턴스도 종료 될 수 있습니다 .이 경우 문제에 따라 em, 응용 프로그램이 다시 연결되지 않을 수 있습니다.

이 범위의 오류 메시지는 동일한 데이터베이스의 데이터에 액세스하는 모든 프로세스에 영향을 미칠 수 있으며 데이터베이스 또는 개체가 손상되었음을 나타낼 수 있습니다. 심각도 수준이 19 ~ 24 인 오류 메시지는 오류 로그에 기록됩니다.

설명

  • ssms의 경우 처음 두 줄이면 충분하고 sql 2000 쿼리 분석기의 경우 작동하지만 메시지가 표시되지 않습니다.
  • 하지만 ' 스크립트가 다음 GO에서 계속 실행됩니까?
  • 여기 에서 언급했듯이 SET NOEXEC ON는 스크립트의 다른 항목이 실행되는 것을 방지하기위한 추가 안전 조치입니다.
  • @Dan Nolan : 어쩐지 세 번째 줄의 요점을 놓쳤습니다. 따라서 올바르게 이해하면 ' SQLCMD 모드 해제를 처리 할 수있는 해결책이 없습니다. 처음에는 :setvar 때문에 기본적으로 incorrect syntax near ':'가 표시됩니다 …
  • @youcantryreachingme RAISERROR 심각도 수준 20 (이상)은 SQL에서 치명적인 오류로 간주되어 연결이 즉시 끊어 지므로 더 이상 배치가 없습니다 (SET NOEXEC ON)가 실행됩니다. NOEXEC 문이있는 이유는 실행중인 사용자에게 sysadmin / 권한은 치명적인 오류를 발생시키는 데 필요합니다.

답변

아니요.

하지만 항상 SQLCMD 모드에서 실행할 수 있으며 T-SQL을 사용할 수 있습니다.

SQLCMD 명령과 Transact-SQL을 명확하게 구분하려면 모든 SQLCMD 명령에 콜론 (:) 접두어를 붙여야합니다.

댓글

  • SQL Server 2012/2014/2016에도 여전히 유효합니까?
  • @ hot2use : 예, 나 ' 2014/2016에 사용

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다