2009-05-29 14 views
6

Próbuję wyszukać tabelę SQL według nazwy i jeśli istnieje, upuść ją. To wszystko musi być zrobione w języku C# przy użyciu SMO.Sprawdzanie i upuszczanie istniejącej tabeli za pomocą C# i SMO

Aby to skomplikować, tabela ma inny schemat niż "dbo".

Ostatecznie stół zostanie odtworzony przez SMO (mam to działa), ale muszę się upewnić, że nie ma go, zanim będę mógł go odtworzyć.

Wszystkie przykłady, które widziałem, wydają się tworzyć, a następnie upuszczać tabelę w tym samym kontekście. W moim przypadku tabela zostanie utworzona i zapełniona w poprzedniej sesji.

Odpowiedz

0

Pierwsze pytanie brzmi: dlaczego nie można upuścić i odtworzyć za pomocą DDL?

A w odpowiedzi na pytanie:

Table table = new Table(myDatabase, "MyTable", "MySchema"); 
+0

Dziękuję za odpowiedź. Tak naprawdę przeszedłem tą samą ścieżką, ale inną ścieżką: myTable.Schema = "MySchema" Sama struktura stołu jest określana w locie przez parsowanie schematu XML. –

1

nie można po prostu owinąć DROP TABLE w bloku try/catch, i odrzucić wszelkie błędy, które występują?

W każdym razie, SQL, aby określić, czy istnieje tabela jest:

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TableName]') AND type in (N'U')) 
+3

To jest wbrew mojemu ziarnu używać błędów do kontroli przepływu programu. Dzięki za odpowiedź. –

+1

Cóż, czy nie możesz skorzystać z IF EXISTS I, aby sprawdzić najpierw, jeśli nie lubisz Try/Catch? –

8
var connection = new SqlConnection(connectionString); 
var server = new Server(new ServerConnection(connection)); 

db = server.Databases["YourFavDB"]; 

db.Tables["YourHatedTable"].Drop(); 
+0

Jedyny, który odpowiedział na to pytanie, a nie na jedno stanowisko do tej pory. Czy w ogóle istnieje sprawiedliwość? – MrTelly

+0

Nie ma tu wzmianki o schemacie. Może to być całkowicie uzasadnione lub niebezpieczne założenie, że schemat jest dbo, w zależności od twojego środowiska. – Davos

+0

Dobra odpowiedź, myślę, że DropIfExists() byłby lepszy – Thunderchild

3

Myślę, że najlepszym rozwiązaniem byłoby:

Microsoft.SqlServer.Management.Smo.Database myDataBase = myServer.Databases["myDataBaseName"]; 
bool tableExists= myDataBase.Tables.Contains("myTable"); 
if (tableExists) 
{ 
    myDataBase.Tables["myTable"].Drop(); 
} 
+0

To powinno być bezwzględnie akceptowaną odpowiedzią na to pytanie. –

Powiązane problemy