빌드 프로세스의 일부로 4 개의 서로 다른 환경에 코드를 배포 할 때 데이터베이스 업데이트 스크립트를 실행합니다. 동일한 쿼리는 우리가 생산으로 릴리스를 떨어질 때까지 추가 얻을 때문에 또한, 이 주어진 데이터베이스에 여러 번 실행할 수 있도록. 이렇게 :
IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = OBJECT_ID(N'[Table]'))
BEGIN
CREATE TABLE [Table]
(...)
END
현재 배포 / 빌드 스크립트에 스키마 생성 문이 있습니다. 스키마가 있는지 어디에서 쿼리합니까?
답변
당신은 sys.schemas 를 찾고 있습니까?
IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'jim')
BEGIN
EXEC('CREATE SCHEMA jim')
END
(가) 있습니다 CREATE SCHEMA
(당 자체의 배치에서 실행해야합니다 아래의 대답 )
답변
@bdukes는 스키마가 존재하는지 확인하는 데 적합하지만 위의 문은 SQL Server 2005에서 작동하지 않습니다 CREATE SCHEMA <name>
. 자체 배치로 실행해야합니다. 해결 방법은 CREATE SCHEMA
exec 에서 문 을 실행하는 것입니다.
다음은 빌드 스크립트에서 사용한 것입니다.
IF NOT EXISTS (SELECT 1 FROM sys.schemas WHERE name = '<name>')
BEGIN
-- The schema must be run in its own batch!
EXEC( 'CREATE SCHEMA <name>' );
END
답변
이것은 오래되어서 추가해야한다고 느낍니다. For SQL SERVER 2008+ 이것들은 모두 (선택 부분에 대해) 작동하고, EXECUTE('CREATE SCHEMA <name>')
실제로 부정적인 결과를 만드는 데 사용 합니다.
DECLARE @schemaName sysname = 'myfunschema';
-- shortest
If EXISTS (SELECT 1 WHERE SCHEMA_ID(@schemaName) IS NOT NULL)
PRINT 'YEA'
ELSE
PRINT 'NOPE'
SELECT DB_NAME() AS dbname WHERE SCHEMA_ID(@schemaName) IS NOT NULL -- nothing returned if not there
IF NOT EXISTS ( SELECT top 1 *
FROM sys.schemas
WHERE name = @schemaName )
PRINT 'WOOPS MISSING'
ELSE
PRINT 'Has Schema'
SELECT SCHEMA_NAME(SCHEMA_ID(@schemaName)) AS SchemaName1 -- null if not there otherwise schema name returned
SELECT SCHEMA_ID(@schemaName) AS SchemaID1-- null if not there otherwise schema id returned
IF EXISTS (
SELECT sd.SchemaExists
FROM (
SELECT
CASE
WHEN SCHEMA_ID(@schemaName) IS NULL THEN 0
WHEN SCHEMA_ID(@schemaName) IS NOT NULL THEN 1
ELSE 0
END AS SchemaExists
) AS sd
WHERE sd.SchemaExists = 1
)
BEGIN
SELECT 'Got it';
END
ELSE
BEGIN
SELECT 'Schema Missing';
END
답변
그냥 할 수 추가 , 다음 버전> 1 일치의 가능성 (그러나 가능성)에 대한 계정에 형식 변환 오류가 발생합니다 “방어” Schema
방법 유효성 검사 코드로의 유사한 I가 그것의 좋은 생각 나는 그것을 믿기 때문에 예외의를 종종 의도적으로 던져 가능한 모든 반환 결과를 설명하는 ” ‘모범 사례'”는 가능성이 낮고 처리 중지의 알려진 효과가 일반적으로 포착되지 않은 오류의 알려지지 않은 연속 효과보다 낫기 때문에 치명적인 예외를 생성하는 경우에도 마찬가지입니다. 그것은 매우 가능성이기 때문에, 나는 그것의 가치가 별도의 문제를 생각하지 않았다 Count
체크 + Throw
또는 Try
– Catch
– Throw
그럼에도 불구하고보다 사용자 친화적 인 치명적인 오류가 여전히 치명적인 오류를 생성 할 수 있습니다.
SS 2005- :
declare @HasSchemaX bit
set @HasSchemaX = case (select count(1) from sys.schemas where lower(name) = lower('SchemaX')) when 1 then 1 when 0 then 0 else 'ERROR' end
SS 2008+ :
declare @HasSchemaX bit = case (select count(1) from sys.schemas where lower(name) = lower('SchemaX')) when 1 then 1 when 0 then 0 else 'ERROR' end
그때:
if @HasSchemaX = 1
begin
...
end -- if @HasSchemaX = 1
답변
구성 요소의 레이아웃이 허용하는 경우 이것도 작동합니다.
존재하는 경우 (선택 1 FROM sys.schemas WHERE 이름 = 'myschema') SET NOEXEC ON 가다 스키마 만들기 myschema 가다 SET NOEXEC OFF-추가 처리가 필요한 경우. 가다