SQL SCRIPT über executesql ausführen.....
-
Hallo allerseits:
Ich habe ein Problem:
Ich habe ein C++ Programm (Dialog) geschrieben, welches auf eine bestehenden Server via ODBC zugreift, ich kann dort Dtanbanken anlegen, löschen, Benutzer anlegen usw, also ne ganze menge.
Um zum Beispiel einen Benutzer auf den Server zu erstellen, öffne das Programm die master Datenbank usw und dann kommt folgendes:
strSQL = _T("exec sp_change_users_login 'Update_One','");
strSQL += strUser;
strSQL += "','";
strSQL += strUser;
strSQL += "'";
UserSQLDatabase.ExecuteSQL(strSQL);strSQL = _T("exec sp_addrolemember N'db_owner', N'");
strSQL += strUser;
strSQL += "'";
UserSQLDatabase.ExecuteSQL(strSQL);AfxMessageBox(_T("Benutzer wurde erfolgreich angelegt."),MB_OK);
UserSQLDatabase.Close();Das ganze funktioniert super und zuverlässig.
So meine eingenliche Frage ist aber eine andere:
Ist es Möglich mit dem ExecuteSQL Befehl ein SQL Script zu starten bzw auszuführen???
Ich hab das schon probiert, dazu lese ich zb. eine Beispiel.sql aus , welche komplett in einen cstring gespeichert wird (formatierung inklusive).
einige Scripte lassen sich auch Problemlos ausführen, aber soblad in dem SQL Script ein "GO" drin steht, bricht er ab.
Ich kann aber GO nicht weglassen, das wird leider bei einigen riesen scripts benötigt.
Wäre Klasse wenn jemand eine Idee hat wie ich komplette Scripte ausführen kann.
Danke im voraus
Gruß
Desper
-
Hehe, ja. Kann einen verwirren wenn man nicht weiss was "GO" macht. "GO" macht AFAIK nix anderes, als ein Script quasi in mehrere "ExecuteSQL" Aufrufe zu unterteilen.
Soll heissen: wenn dein Script "GO"s enthält musst du es anhand der "GO"s in mehrere Teile zerlegen, und dann für jeden Teile "ExecuteSQL" aufrufen.
Blöd dabei ist bloss dass du dazu SQL parsen müsstest, sonst könnten Statements ala "select go from my_table" zu Problemen führen
-
^^,
was GO ist weiss ich, aber die Idee ist an sich gut, ich werds nachher mal ausprobieren, mal gucken was dabei rumkommt.
Vielen Dank für die Antwort.
-
Dem was hustbaer schreib ist nicht viel hinzuzufügen:
Wir haben eine kleine eigene Engine geschrieben. Die reagiert einfach auf GO, sofern es alleine in einer Zeile steht.
An diesen Stellen wird das Skript auseinander gebrochen und die entsprechenden Abschnitte zerlegt.
Grundsätzlich ist oft ein GO gar nicht notwendig. In vielen Fällen, sofern eben keine neuen Objektnamen hinzukommen kann man auch größte SQL Befehle auf einen Schlag ausführen lassen. DER SQL Server weißt dann oft genug auch eine besseere Performance auf, weil er teile der Skripte und auch die Cache Nutzung dann optimieren kann.
Zwingend wird ein GO, wenn eine Tabelle angelegt werden soll und die gefüllt wird. Ohne eine Separierung fliegt der SQL Parser auf die Nase, weil er die Namen die erst im Create angelegt werden noch nicht kennt.
-
jau,
die scripte die bei uns ausgeführt werden sind ziemlich groß und wachsen aus ständig, es werden zum Beispiel in einem Script unsere Views aktuallisiert, und da sind ne menge "GO" drin.
Aber ich habe das so gemacht wie Ihr gesagt habt, ich lasse immer nach dem Go suchen, und speichere mir die einzelnen Blöcke in einer Seperaten Variabel ab und kann diese
über executesql ausführen,
tolle sache,
funktioniert wunderbarvielen dank noch mal,
endlich bekommt man mal hilfe, in anderen foren, wird nur blöd angesaugt....
-
Ich hatte auch mal Support für SQL-Scripts in einem Programm drinnen (wurde dann zwar nie produktiv verwendet, aber egal). Und da hatte ich das gleich wie der Martin gemacht, nämlich einfach gefordert dass "GO" gefälligst in einer eigenen Zeige zu stehen hat, und dass ein "GO" welches alleine in einer Zeile steht auch nie Bestandteil eines Statements sein darf (wo es dann z.B. eben ein Spaltenname o.Ä. sein könnte).
BTW: hab grad nochmal rumprobiert, der Query Analyzer macht anscheinend auch nix anderes, also der macht garkein SQL Parsing um zu unterscheiden wo GO eben GO heisst, und wo es einfach nur ein Bezeichner ist.
Die folgenden Scripte gehen zumindest nicht:
select 1 as GO
select 1 as a GO select 2 as b
Und das wiederum geht:
select 1 as GO select 2 as b
Hatte mir gedacht dass der schlauer ist, aber ist vermutlich a) zuviel Aufwand und b) auch oft zu unklar ... "select 1 go select 2" - hiesse das dann "select 1 as go, select 2" oder "select 1, go, select 2"?