2008-10-22 28 views
73

sorgusu nasıl yapılır Sorgulama işlemimizin bir parçası olarak, 4 farklı ortama kod dağıttığımız için bir veritabanı güncelleştirme komut dosyası çalıştırıyoruz. Ayrıca, aynı sorgu, üretime bir sürüm bırakana kadar eklendiğinden, belirli bir veritabanında birden çok kez çalışabilmesi için 'un'u vardır. Bunun gibi:Bir veritabanı şeması varsa

IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = OBJECT_ID(N'[Table]')) 
BEGIN 
    CREATE TABLE [Table] 
    (...) 
END 

Şu anda dağıtım/derleme komut dosyası oluşturmak için bir şema deyim var. Bir şemanın varlığını nerede bulabilirim?

+2

kabul cevabı değiştirmeyi düşünün lütfen. Kabul ettiğin cevabın aslında senin için yazılmış olması mümkün değil. –

cevap

108

sys.schemas mi arıyorsunuz? CREATE SCHEMA (the answer below başına) kendi toplu çalıştırmak gerektiğini

IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'jim') 
BEGIN 
EXEC('CREATE SCHEMA jim') 
END 

Not

+0

Darn ... o zaman beni daha okunabilir hale getirmek için yazıyı düzenlemeye götürdüğünde ... sorunumu düzelttin. Teşekkürler mucho! – Pulsehead

+17

bu SQL 2008'de çalışmaz, CREATE SCHEMA'nın bir toplu işteki ilk ifadesi olması gerektiğinden, bir geçici çözüm için vfilby yazısına bakın – sergiom

+3

Performansı iyileştirmek için 'sys.schemas' dan 1'i seçin. – vijaysylvester

137

@bdukes şema varsa belirlemek için para haklı, ama deyim yukarıdaki SQL çalışmaz Server 2005. CREATE SCHEMA <name> kendi grubunda çalışmalıdır. Çevresinde bir çalışma, bir exec içinde CREATE SCHEMA deyimini yürütmektir. İşte

benim yapı komut kullanılan budur:

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 
+0

çekicilik gibi çalışıyor! Bu bile benim baskı beyanlarımı ve her şeyi yazmamı sağlıyor. – Tony

+0

Doğru cevap bu olmalı. – Pimenta

1

Sadece olmak ekstra aşağıdaki sürüm> olasılığı (ancak düşüktür) hesaplanması bir Tür dönüştürme hatası üretir "savunmacı" 1 eşleştirme kodu genellikle kasıtlı olarak Atma İstisnası'na benzeyen Schema 'un benzerlik gösterdiğine inanıyorum çünkü ben bunun iyi olduğuna inanıyorum ve mümkün olan tüm olası sonuçların hesaplanmasının mümkün olmadığı ve hatta sadece ölümcül bir istisna oluşturduğu halde bile "en iyi uygulama" olduğuna inanıyorum Durdurma işleminin bilinen etkileri genellikle, yakalanmamış hataların bilinmeyen basamaklı etkilerinden daha iyidir. Son derece olası olmadığı için, daha kullanıcı dostu bir ölümcül hata oluşturmak ancak yine de ölümcül bir hata oluşturmak için ayrı bir Count + Throw veya Try - Catch - Throw kontrolüne değdiğini düşünmüyordum.

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 

Ardından:

if @HasSchemaX = 1 
begin 
    ... 
end -- if @HasSchemaX = 1 
+0

Büyük/küçük harfe duyarlı bir harmanlama kullandığınızda birden çok eşleşen şemaya sahip olabileceğinizi varsayalım, ancak "hatanın ele alınması", aşağıdaki hatayla sonuçlanacaktır: * Varchar değeri 'ERROR', veri türü int. – Stijn

+0

@Stijn: Doğrulama kodunun kasıtlı olarak 'İstisna' özelliğine nasıl benzediğine benzer "Tasarımla". Söylediğin gibi, "olması muhtemel" değil, bu yüzden IMHO, bütün bir "Try" -Catch'e ya da "Count" kontrolüne değmez, daha kullanıcı dostu bir ölümcül hata üretmek için, ama ne olursa olsun, Büyük ihtimalle ölümcül bir hata istiyorum. İnanıyorum ki, mümkün olan tüm geri dönüş sonuçlarını hesaba katmak için inanıyorum ve olası bir istisnai durum ortaya çıkarsa bile “en iyi uygulama” olduğuna inanıyorum çünkü durdurma işleminin bilinen etkileri genellikle bilinmeyen kademeli etkilerden daha iyidir. hatalar. – Tom

+0

Tüm kulağa hoş geliyor, kasıtlı olup olmadığından emin değildim :) Cevabınız, yorumunuzda verdiğiniz gibi, bazı ek açıklamalardan yararlanabilir. – Stijn

İlgili konular