Unterschied zwischen SQL-Batch, Anweisung und RPC?


35

Was ist der Unterschied zwischen SQL-Batch, T-SQL-Anweisung und Remote Procedure Call?
Wie kann ich feststellen, ob ein Teil des T-SQL-Codes ein Stapel oder eine Anweisung ist?

Antworten:


25

Nun, ich nehme an, Sie sprechen hauptsächlich über die Profiler-Klassen, aber die Erklärung steht trotzdem.

Ein SQL-Batch besteht aus einer oder mehreren Anweisungen, die durch eine GO-Anweisung gruppiert und getrennt sind. ZB: Weitere SELECT- und INSERT-Anweisungen bilden einen Stapel, wenn sie am Ende ein GO haben.

Ein RPC-Aufruf ist ein Aufruf, der von einer Clientanwendung an die Datenbank gesendet wird. ZB: Ein Windows-Dienst, eine Webanwendung, eine Windows-Anwendung, was auch immer eine Verbindung zur Datenbank benötigt, führt tatsächlich einen RPC-Aufruf durch.

Jetzt sehen Sie in Profiler alles, was den Datenbankserver berührt. Ein Stapel aus Management Studio, ein RPC-Aufruf (entweder ein Stapelaufruf oder ein Aufruf einer gespeicherten Prozedur) aus einer externen Anwendung, eine Prozedurausführung aus Management Studio.

Jede dieser Anweisungen besteht aus TSQL-Anweisungen. Daher ist diese Profiler-Klasse hilfreich, wenn Sie die Ausführung weiter erweitern möchten, um zu sehen, was tatsächlich ausgeführt wird. Was einfügt, wählt ... usw.

Die einfachste Möglichkeit, sie im Profiler anzuzeigen, besteht darin, nur RPC-Aufruf beenden oder Batch-Aufruf beenden zu aktivieren. Dort werden alle erforderlichen Statistiken (Dauer, E / A, CPU) angezeigt. Bewegen Sie sich dann weiter, indem Sie die Klasse TSQL-Anweisungen aktivieren und tiefer graben.


4
+1 Nur um zu spezifizieren, GOist das akzeptierte und standardmäßige Stapelabschlusszeichen der von uns verwendeten gängigen Clients (z. B. SSMS und sqlcmd). Es ist jedoch zu beachten, dass sich die tatsächliche GOZeichenfolge als Stapelabschlusszeichen ändern kann und konfigurierbar ist.
Thomas Stringer

1
Msgstr "Ein RPC - Aufruf (entweder ein Stapelaufruf oder ein Aufruf einer gespeicherten Prozedur)" . Also ist am Ende alles RPC? Können Sie das klarstellen?
Iain Samuel McLean Elder

Nein, ich wollte sagen, dass ein RPC-Aufruf entweder aus einem Aufruf einer gespeicherten Prozedur oder einer Reihe weiterer Anweisungen besteht. Was Sie in diesem Profiler-Ereignis tatsächlich sehen, ist entweder eine einzelne Prozedur oder eine Reihe weiterer Anweisungen.
Marian,

Bitte beachten Sie eine Erklärung hier . Einige andere Infos hier .
Marian

14

Batch vs T-SQL-Anweisung

Dies ist hier in SQL Server BOL klar definiert

Ein Batch ist eine Gruppe von mindestens einer Transact-SQL-Anweisung, die zur Ausführung gleichzeitig von einer Anwendung an SQL Server gesendet wird. Go ist ein Stapeltrennzeichen, das in den meisten Clientanwendungen einschließlich SSMS verwendet wird.

SQL Server kompiliert die Anweisungen eines Stapels in einer einzigen ausführbaren Einheit, einem Ausführungsplan. Die Anweisungen im Ausführungsplan werden dann einzeln ausgeführt.

Nach meinem Verständnis bedeutet RPC, dass Sie einen gespeicherten Prozess über die Client-API ausführen (z. B. in ADO.net CommandObject. Execute-Methode).

Eine ausführlichere Erklärung finden Sie in einer der Internet-Newsgroup-Veröffentlichungen hier :

RPC "vs" batch "ist der TDS-Ausführungsmodus, den ADO.NET (oder ein beliebiger SQL Server-Client) verwendet. Wenn eine einfache SQL-Anweisung ohne Parameter ausgeführt wird, wird ein" batch "verwendet. Wenn ein gespeicherter Prozess ausgeführt wird, Wir verwenden RPC (dies ist nicht dasselbe wie RPC wie der eigenständige Netzwerk-Remoteprozeduraufruf. Wir nennen diesen Modus nur RPC in TDS (dem SQL Server-Netzwerkprotokoll). Wenn Sie einen Batch mit Parameter ausführen, Wir verwenden tatsächlich einen gespeicherten Prozess namens sp_executesql und übergeben die SQL-Anweisung selbst und den Rest der Parameter an diesen, sodass er auch als RPC angezeigt wird.

Pablo Castro-
Programm-Manager - ADO.NET-Team
Microsoft Corp.


Wenn eine Anweisung im Batch fehlschlägt, wird der gesamte Batch automatisch zurückgesetzt.
MonsterMMORPG

Nein, jede Anweisung im Stapel wird autonom festgeschrieben, es sei denn, der Stapel befindet sich in einer aktiven Transaktion oder Sie setzen IMPLICIT_TRANSACTIONS auf ON. Stapel und Transaktionen sind zwei unterschiedliche Konzepte. Ich weiß, dass die Frage sehr alt ist, ich lasse dies hier nur für zukünftige Leser.
Spaghettidba
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.