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


17

SSMS가 SQLCMD 모드를 활성화 / 비활성화하도록 스크립트에서 사용할 수있는 지시문과 같은 것이 있습니까?

답변:


17

말했듯이, 방법이 없습니다.

그러나 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 not see this unless SQLCMD mode is on'
-- Rest of script goes here

GO
SET NOEXEC OFF
GO

심각도 20을 사용하는 이유가 있는데, GO나중에 스크립트에 배치 터미네이터 가 있더라도 더 이상 스크립트 코드가 실행되지 않도록 연결을 즉시 종료하는 경향이 있습니다 .

심각도 20-24 :

시스템 문제를 나타내며 치명적인 오류이므로 명령문 또는 배치를 실행하는 데이터베이스 엔진 태스크가 더 이상 실행되지 않습니다. 작업은 발생한 내용에 대한 정보를 기록한 다음 종료됩니다. 대부분의 경우 데이터베이스 엔진 인스턴스에 대한 응용 프로그램 연결도 종료 될 수 있습니다 . 이 문제가 발생하면 문제에 따라 응용 프로그램을 다시 연결하지 못할 수 있습니다.

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


ssms의 경우 처음 두 줄이면 충분하고 sql 2000 Query Analyzer의 경우 작동하지만 메시지가 표시되지 않습니다.
bernd_k

그러나 스크립트가 다음 GO에서 계속 실행되지 않습니까?
Dan Nolan

SSMS 2008 R2를 사용하고 있으며 Meldung 102, Ebene 15, Status 1, Zeile 1 ':'근처의 구문이 잘못되었습니다. SQL Server 2000 쿼리 분석기를 사용하려면 RAISERROR를 사용해야합니다.
bernd_k

4
여기 에 언급 된대로 SET NOEXEC ON스크립트의 다른 항목이 실행되지 않도록 추가 안전 조치로 설정할 수도 있습니다 .
야후 심각한

흠, 이것은 SQLCMD 모드가 켜져 있는지 확인하기 위해 SQLCMD 모드를 사용하고 있습니다 ... @ bernd_k가 경험했듯이 SQLCMD 모드가 꺼져 있으면 제대로 작동하지 않는다고 말하고 싶습니다. 그러나 : setvar이 SQL에 대해 제거 / 대체되면 작동합니다.
Oak_3260548

7

아니.

그러나 항상 SQLCMD 모드 에서 실행하고 T-SQL을 가질 수 있습니다.

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


이것은 여전히 ​​SQL Server 2012/2014/2016에 유효합니까?
John aka hot2use

1
@ hot2use : 예, 나는 그것을 2014/2016에 사용했습니다
gbn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.