programing

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

lastmoon 2023. 4. 17. 22:13
반응형

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

이 데이터베이스의 모든 사용자와 스키마를 작성하는 스크립트를 생성했는데, CREATE 문을 IF EXISTES 체크로 랩하면 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]')

이 요구의 이유는 이전 버전의 V2와 관련이 있다고 생각합니다.CREATE SCHEMA버전 6.5에서 도입된 구문(적어도 여기에 기재되어 있습니다).

(항상) Dynamic SQL 사용이 허용되지 않을 수 있으므로EXEC최선의 접근법이 아닙니다.사용.GO스테이트먼트를 사용하면 작업이 향상됩니다.

USE [MyDB]
GO

IF (SCHEMA_ID('MySchema') IS NOT NULL)
BEGIN
    DROP SCHEMA [MySchema];
END

GO

CREATE SCHEMA [MySchema] AUTHORIZATION [dbo]

GO

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

반응형