2011-04-08 5 views
5

Mamy kod, który czyta się w zbiorze skryptów SQL, a po wykonaniu niektórych operacji dzieli je na partie, znajdując słowo kluczowe "GO", a następnie wysyła każdą partię do serwera Sql przy użyciu oddzielnego SqlCommon.Począwszy od .net jak wysłać wiele "partii" SQL do Sql-Server bez dużo podróży w obie strony?

Czy istnieje lepszy sposób to zrobić więc:

  • Nie masz tyle okrągłe wycieczki
  • Nigdy nie SQL Server czeka na następnej partii
  • działać szybciej.

(Partie są głównie tworzenie tabel, indeks, widoki i przechowywane procs. Prędkość jest problem jak nazywa nasze testy integracyjne kod często. Narzędzia wspólnej linii sql-server nie może być zainstalowany na komputerze, który jest działa ten kod.)

+0

Czy obie naprawdę znaczące w.r.t. baza ops? Sądzę, że już zaaranżowałeś jak najwięcej w każdej partii? – Rup

+0

@Rup, łączenie partii zajęłoby dużo czasu ręcznej edycji SQL. Próbuję znaleźć szybki zysk, który daje nam wiele korzyści. –

Odpowiedz

2

Najszybszym rozwiązaniem jest dzielenie na GO. Jednak inną alternatywą jest użycie SQL Management Objects (SMO) i wysłanie całego skryptu do SQL Server za jednym zamachem, tak jakbyś korzystał z Management Studio.

var connectionString = ConfigurationManager.ConnectionStrings[ connectionStringName ].ConnectionString; 
using (var sqlConnection = new SqlConnection(connectionString)) 
{ 
    var server = new Server(new ServerConnection(sqlConnection)); 
    server.ConnectionContext.Connect(); 
    server.ConnectionContext.ExecuteNonQuery(sqlFileContents); 
    server.ConnectionContext.Disconnect(); 
} 

SQL Server Management Objects (SMO)

+0

Zachowaj ostrożność podczas dzielenia na GO: Natychmiast po dodaniu wielowierszowych komentarzy zawierających linie GO (tj. Skrypty wielopasowe, które są częściowo komentowane), całe piekło się rozpadnie. Jeśli potrzebujesz obsługi tego typu sprawy, najlepiej iść z SMO. – Tao

+0

Kolejna uwaga na temat tej odpowiedzi - niezależnie od tego, czy podzielisz na GO, czy użyjesz SMO, ** będzie wiele podróży w obie strony: SMO również przesyła każdą partię do serwera osobno. – Tao

3

2 pomysły ...

pakiecie skrypt i zmodyfikować go być runnable jako dynamiczny SQL fragmencie. Prześlij całą partię w strumieniu za pomocą nvarchar (max) i uruchom ją za pomocą sp_executesql po stronie serwera. Ponieważ kontrolujesz to do testów integracyjnych, dynamiczny SQL nie stanowi większego problemu.

Załaduj całą partię na serwer jako nvarchar (max). Zapisz plik na komputerze z programem SQL Server za pomocą polecenia xp_cmdshell lub CLR lub innego. Ponownie używając xp_cmdshell, użyj skryptu sqlcmd, aby uruchomić plik skryptu.

Z każdym rodzajem grupowania, tracisz jakiś sposób identyfikacji dokładnie, gdzie się zepsuł, ponieważ w końcu automatyzujesz testowanie integracyjne.

+0

Znajomość złamanych bitów SQL jest dla nas wartościowa, więc musielibyśmy przeprowadzić "serię" po stronie serwera, dając dobre błędy. –