Différence entre batch SQL, instruction et RPC?

35

Quelle est la différence entre batch SQL, instruction T-SQL et appel de procédure distante?
Comment savoir si une partie du code T-SQL est un lot ou une instruction?

FrogEye
la source

Réponses:

25

Eh bien, je suppose que vous parlez surtout des classes Profiler, mais l'explication reste valable.

Un lot SQL est un ensemble d'une ou plusieurs instructions regroupées et séparées par une instruction GO. EG: plusieurs instructions SELECT et INSERT forment un lot si elles ont un GO à la fin.

Un appel RPC est un appel provenant d'une application cliente vers la base de données. Exemple: un service Windows, une application Web, une application Windows, tout ce qui nécessite une connexion à la base de données effectue un appel RPC.

Maintenant, dans Profiler, vous verrez tout ce qui touche le serveur de base de données. Un lot de Management Studio, un appel RPC (qui est un appel de lot ou de procédure stockée) à partir d'une application externe, une procédure exécutée à partir de Management Studio.

Chacune d'entre elles est formée d'instructions TSQL. Cette classe Profiler est donc utile si vous souhaitez développer davantage l'exécution afin de voir ce qui est réellement exécuté. Que insère, selects..etc.

La manière la plus simple de les consulter dans Profiler consiste à n’activer que l’appel End RPC ou End batch call et vous y verrez toutes les statistiques nécessaires (durée, E / S, CPU). Ensuite, allez plus loin en activant la classe TSQL Statements et approfondissez davantage.

Marian
la source
4
+1 Juste pour spécifier, GOest le terminateur de batch accepté et par défaut des clients populaires que nous utilisons (SSMS et sqlcmd), mais il convient de noter que la GOchaîne réelle en tant que terminaison de lot est susceptible de changer et est configurable.
Thomas Stringer
1
"Un appel RPC (qui est un appel batch ou un appel à une procédure stockée)" . Donc tout est RPC à la fin? Pouvez-vous clarifier cela?
Iain Samuel McLean Elder
Non, je voulais dire qu'un appel RPC est formé d'un appel de procédure stockée ou d'un lot de plusieurs instructions. Ce que vous voyez réellement dans cet événement Profiler est soit une procédure unique, soit un lot de plusieurs instructions.
Marian
S'il vous plaît voir une explication ici . Quelques autres informations ici .
Marian
14

Instruction Batch vs T-SQL

Ceci est clairement défini dans SQL Server BOL ici

Un lot est un groupe d'une ou plusieurs instructions Transact-SQL envoyées simultanément d'une application à SQL Server pour exécution. Go est un séparateur de lots utilisé dans la plupart des applications clientes, y compris SSMS.

SQL Server compile les instructions d'un lot en une seule unité exécutable, appelée plan d'exécution. Les instructions du plan d'exécution sont ensuite exécutées une par une.

Dans un terme simple basé sur ma compréhension du code RPC, vous exécutez une procédure stockée à l'aide de l'API client (par exemple, dans la méthode ADO.net CommandObject. Execute).

Une explication plus détaillée se trouve dans l'un des messages postés sur les groupes de discussion Internet ici :

RPC "vs" batch "est le mode d'exécution TDS utilisé par ADO.NET (ou tout autre client SQL Server). Lorsqu'une instruction SQL simple sans paramètre est exécutée, nous utilisons un" batch ". Lorsqu'un processus stocké est exécuté, nous utilisons RPC (ce n'est pas la même chose que RPC en tant qu'appel de procédure distante réseau autonome, il nous arrive d'appeler ce mode RPC dans TDS (le protocole réseau SQL Server)). De plus, si vous exécutez un lot avec paramètre, nous utilisons en fait un processus stocké appelé sp_executesql, et nous passons l'instruction SQL elle-même et le reste des paramètres, de sorte qu'elle s'affiche également en tant que RPC.

Pablo Castro
Responsable de programme - Équipe ADO.NET
Microsoft Corp.

Apprenant SQL
la source
donc si une instruction dans le lot échoue, le lot entier est automatiquement annulé?
MonsterMMORPG
Non, chaque instruction du lot est validée de manière autonome, sauf si le lot se trouve dans une transaction active ou si vous définissez IMPLICIT_TRANSACTIONS ON. Les lots et les transactions sont deux concepts différents. Je sais que la question est très ancienne, je la laisse juste ici pour les futurs lecteurs.
spaghettidba