Program Tip

SQL Management Studio의 시작 / 끝 블록에서 "스키마 만들기"를 사용할 수없는 이유는 무엇입니까?

programtip 2020. 12. 3. 19:09
반응형

SQL Management Studio의 시작 / 끝 블록에서 "스키마 만들기"를 사용할 수없는 이유는 무엇입니까?


이 데이터베이스에 대한 모든 사용자와 스키마를 생성하는 스크립트를 생성했으며 IF EXISTS 검사로 CREATE 문을 래핑 할 때 CREATE SCHEMA 호출이 BEGIN / END 블록에서 실행되는 것을 허용하지 않는다는 것을 알았습니다. 잘못된 구문이라고 불평합니다. 그러나 나는 그 자체로 명령을 실행할 수 있습니다. 코드 샘플은 다음과 같습니다. SQL Server 2008 및 Management Studio R2를 사용하고 있습니다. 왜이 잘못된 구문입니까?

--DROP SCHEMA [acme]

IF (NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'acme')) 
BEGIN
    CREATE SCHEMA [acme] AUTHORIZATION [dbo]
END

스키마 생성은 배치에서 유일한 문이어야합니다. 이를 우회하는 한 가지 방법은 다음과 같습니다.

IF (NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'acme')) 
BEGIN
    EXEC ('CREATE SCHEMA [acme] AUTHORIZATION [dbo]')
END

다음은 더 간단한 솔루션입니다 (간단한 검사).

IF (SCHEMA_ID('acme') IS NULL) 
BEGIN
    EXEC ('CREATE SCHEMA [acme] AUTHORIZATION [dbo]')
END

자체 배치에 있어야합니다. 포장 할 수 있습니다EXEC('')

EXEC('CREATE SCHEMA [acme] AUTHORIZATION [dbo]')

요구 사항의 이유 CREATE SCHEMA는 버전 6.5에 도입 된 이전 버전의 구문 과 관련이 있다고 생각합니다 ( 적어도 여기에 설명되어 있음 ).


CREATE SCHEMA자체 배치에 있어야하므로 안에 포함하면 EXEC괜찮습니다.

IF (NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'acme')) 
BEGIN
    EXEC ('CREATE SCHEMA [acme] AUTHORIZATION [dbo]')
END

참고 URL : https://stackoverflow.com/questions/5748056/why-cant-i-use-create-schema-in-a-begin-end-block-in-sql-management-studio

반응형