2008-11-21 14 views
11

Tamam, Sybase böylece (12.5.4) beni zaten varsa bir tablo DROP için aşağıdakileri yapın sağlayacak:Koşullu olarak Sybase'de (TSQL) bir tablo nasıl oluşturabilirim?

IF EXISTS (
    SELECT 1 
    FROM sysobjects 
    WHERE name = 'a_table' 
    AND type = 'U' 
) 
DROP TABLE a_table 
GO 

Ama tablo oluşturma ile aynı şeyi yapmaya çalışırsanız, hep uyardı olsun tablo zaten var çünkü devam etti ve masamı yaratmaya çalıştı ve şartlı ifadeyi göz ardı etti.

IF NOT EXISTS (
    SELECT 1 
    FROM sysobjects 
    WHERE name = 'a_table' 
    AND type = 'U' 
) 
CREATE TABLE a_table (
    col1 int not null, 
    col2 int null 
) 
GO 

yukarıda Koşu aşağıdaki hata üretir: Sadece, ne demek istediğimi görürsünüz iki kez aşağıdaki ifadeyi çalıştırmayı deneyin

SQL Server Error on (localhost) Error:2714 at Line:7 Message:There is already an object named 'a_table' in the database.

o olayı nedir ?! ,

IF NOT EXISTS (
    SELECT 1 
    FROM sysobjects 
    WHERE name = 'a_table' 
    AND type = 'U' 
) 
EXECUTE("CREATE TABLE a_table (
    col1 int not null, 
    col2 int null 
)") 
GO 

eser bir cazibe gibi kirli kesmek gibi hissediyor:

+0

Aşağı çekilme yanıtları nedir? Ve sonra kabulünü kendin mi vereceksin? Cevapsız mı? – dkretz

+0

Soruyu yanıtlamada yardımcı olmayan cevapları reddettim, bu aşağılama amaçlı. Yardım ettiğim ve yaşayabileceğimiz cevapları bıktım, ama sonuçta benim için çalışan tek çözüm benim oldu. Kendi sorumu cevapladığım için cevap alamıyorum, bu yüzden bunu yapmak benim avantajım değil. – ninesided

+0

Yeterince adil. Sorunuzun cevabım tarafından ele alındığından emin olmadıkça cevap vermemeyi hatırlayacağım. Bu durumda, bilmek için yeterli bilgi yoktu, bu yüzden zamanımı harcıyordum. – dkretz

cevap

12

Ben şimdiye kadar ile geldim tek geçici çözüm hemen yürütme kullanmaktır.

+4

Uzun zaman önce bunu yanıtladığınızı biliyorum, ancak diğer insanlar için bu, sybase el kitabının koşullu oluşturma gereksiniminin tam olarak ne anlama geldiğini açıklıyor çünkü "Bir create table komutu bir if… else bloğu veya bir while döngüsü içinde gerçekleştiğinde" Adaptive Server, koşulun doğru olup olmadığını belirlemeden önce tablo için şema oluşturur.Bu tablo zaten varsa, hatalara yol açabilir.Bu durumdan kaçınmak için, veritabanında aynı ada sahip bir görünümün bulunmadığından emin olun. Bir yürütme ifadesi kullanın ... " – scrappedcola

+1

Anlaşıldı .. Sadece http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0 adreslerine bir bağlantı eklemek istedim. komutlar/html/commands61.htm – msrxthr

-2
IF object_id('a_table') IS NULL 
BEGIN 
    CREATE TABLE a_table (
     col1 int not null, 
     col2 int null 
    ) 
END 
+0

Hayır, bu da başarısız oluyor. Aynı hata. – ninesided

2

Bunu test etmedim, ancak create table deyimini bir sproc'e taşımayı deneyebilirsiniz. Daha sonra, koşullu olarak, mevcut ifadenize dayalı olarak sproc'i çağırabilirsiniz.

-2

Başla ve Sona kullanmayı deneyin.

değil EXISTS

( SEC Sayısı (1) sysobjects DAN adı = 'a_table' ve tipi = 'U' WHERE) , col2 col1 null int ( CREATE TABLO a_table BEGIN int null) END ) @variable bir EXEC (do ardından

+0

Üzgünüm, hiçbir zar. "Veritabanında" a_table "adlı bir nesne zaten var". – ninesided

1

bir karakter @variable içinde "TABLO OLUŞTURMA" deyimi atama GO ve.

7

execute("create table ...")

Sybase Kılavuzu'nda create table arayarak dışında başka yolu yoktur diyor ki: Her zaman bunu tablo oluşturmak, ancak koşullu olarak düşmesi istiyorsanız

When a create table command occurs within an if...else block or a while loop, Adaptive Server creates the schema for the table before determining whether the condition is true. This may lead to errors if the table already exists. To avoid this situation, either make sure a view with the same name does not already exist in the database or use an execute statement, as follows:

if not exists 
    (select * from sysobjects where name="my table") 
begin 
execute "create table mytable(x int)" 
end 
0

, şunları kullanabilirsiniz:

IF(SELECT count(*) FROM sysobjects WHERE name="tableNameWithoutUserPart") > 0 
    DROP TABLE tableNameWithUserPart 
GO 

CREATE TABLE tableNameWithUserPart ... 
0

gerekmez geçici çözümler vardır;)Belgelere göre :

CREATE [ GLOBAL TEMPORARY ] TABLE [ IF NOT EXISTS ] [ owner.]table-name 
({ column-definition | table-constraint | pctfree }, ...) 
[ { IN | ON } dbspace-name ] 
[ ENCRYPTED ] 
[ ON COMMIT { DELETE | PRESERVE } ROWS 
    | NOT TRANSACTIONAL ] 
[ AT location-string ] 
[ SHARE BY ALL ] 

Sadece IF NOT EXISTS kullanın.

+1

OP, Sybase ASE'ye baktığından bu yanlıştır, çünkü belgeleri şu adreste bulunmaktadır: http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc01840.1600/doc/html /san1281564827401.html. Kopyaladığınız dilbilgisi başka bir ürün olan SAP Sybase IQ http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc01840.1600/doc/html/san1281564827401.html adresindedir. – nhahtdh

+0

Kopyaladığım sözdizimi, Çevrimdışı Sybase Anywhere 12 Belgelerim'den ve bu sözdizimi orada çalışıyor. Tamam ASE etiketini görmedim;) –

-1

Bu, Sybase ile 10 her yerde test edildiğinde çalışır.01:

if not exists(select * from SysColumns where tname = 'AAA') then create table DBA.AAA( UNIQUEID integer not null) END IF ; 
+1

bu soru ASE ile değil, Her Yerde – ninesided

İlgili konular