Quelqu'un peut-il me dire quand et où j'ai besoin d'utiliser des blocs begin
et end
dans SQL Server? En outre, que fait exactement le mot clé Go
?
Merci d'avance...
Quelqu'un peut-il me dire quand et où j'ai besoin d'utiliser des blocs begin
et end
dans SQL Server? En outre, que fait exactement le mot clé Go
?
Merci d'avance...
ALLER, c'est comme la fin d'un script.
Vous pourriez avoir plusieurs instructions CREATE TABLE, séparés par ALLER. C'est une façon d'isoler une partie du script à partir d'un autre, mais la présentation en un seul bloc.
De début et de FIN sont comme les { et }/ C++/#, Java, etc.
Ils ont lié une logique de bloc de code. J'ai tendance à utiliser de début et de FIN au début et à la fin d'une procédure stockée, mais il n'est pas strictement nécessaires. Là où c'est nécessaire, c'EST pour les boucles, et SI les déclarations, etc, où vous avez besoin de plus d'une étape...
IF EXISTS (SELECT * FROM my_table WHERE id = @id)
BEGIN
INSERT INTO Log SELECT @id, 'deleted'
DELETE my_table WHERE id = @id
END
Vous avez besoin de BEGIN ... END pour créer un bloc couvrant plusieurs instructions. Donc, si vous vouliez faire deux choses dans une "branche" d'une instruction IF, ou si vous vouliez faire plus d'une chose dans le corps d'une boucle WHILE, vous auriez besoin de mettre entre crochets ces déclarations avec BEGIN ... FIN.
Le mot clé GO ne fait pas partie de SQL. Query Analyzer ne l'utilise que pour diviser les scripts en "lots" exécutés indépendamment.
ALLER n'est pas un mot clé dans SQL Server; c'est un séparateur de lot. ALLER extrémités d'un lot de déclarations. Ceci est particulièrement utile lorsque vous utilisez quelque chose comme SQLCMD. Imaginez que vous entrez dans les instructions SQL sur la ligne de commande. Vous n'avez pas forcément envie la chose d'exécuter tous les temps de la fin d'une instruction SQL Server ne fait rien jusqu'à ce que vous entrez sur "GO".
De même, avant votre traitement commence, vous avez souvent besoin d'avoir certains objets visibles. Par exemple, disons que vous êtes la création d'une base de données et l'interrogation d'elle. Vous ne pouvez pas écrire:
CREATE DATABASE foo;
USE foo;
CREATE TABLE bar;
parce que toto n'existe pas pour le lot qui ne le CREATE TABLE. Vous devez faire ceci:
CREATE DATABASE foo;
GO
USE foo;
CREATE TABLE bar;
De début et de FIN ont été bien répondu par d'autres.
Comme Gary points, rendez-vous est un séparateur de lot, utilisé par la plupart des Microsoft fourni les outils du client, telles que isql, sqlcmd, l'analyseur de requêtes et SQL Server Management studio. (Au moins certains des outils de permettre le séparateur de lots d'être changé. Je n'ai jamais vu utiliser pour changer le séparateur de lots.)
Pour répondre à la question de savoir quand l'utiliser, on doit savoir lorsque le SQL doivent être séparés en lots.
Certains états doit être la première instruction d'un lot.
select 1
create procedure #Zero as
return 0
Sur SQL Server 2000, l'erreur est:
Msg 111, Level 15, State 1, Line 3
'CREATE PROCEDURE' must be the first statement in a query batch.
Msg 178, Level 15, State 1, Line 4
A RETURN statement with a return value cannot be used in this context.
Sur SQL Server 2005, l'erreur est moins utile:
Msg 178, Level 15, State 1, Procedure #Zero, Line 5
A RETURN statement with a return value cannot be used in this context.
Ainsi, l'utilisation de GO
aux états distincts, qui doivent être le début d'un traitement à partir des déclarations qui précèdent dans un script.
Lors de l'exécution d'un script, de nombreuses erreurs de provoquer l'exécution du traitement d'arrêter, mais alors le client va envoyer tout simplement la prochaine fournée, de l'exécution du script s'arrête pas. J'ai souvent recours à ce test. Je vais lancer le script avec commencer la transaction et la fin avec la restauration, de faire tous les tests dans le milieu:
begin transaction
go
... test code here ...
go
rollback transaction
De cette façon je peux toujours revenir à l'état initial, même si une erreur s'est passé dans le code de test, le début et la restauration des relevés de transaction faisant partie de séparer les lots arrive encore. S'ils n'étaient pas en lots séparés, une erreur de syntaxe serait de garder begin transaction se passe, depuis un lot est analysé comme une unité. Et une erreur d'exécution serait de garder la restauration de passe.
Aussi, si vous faites un script d'installation, et ont plusieurs lots dans un fichier, une erreur dans le traitement d'un lot ne gardera pas le script de continuer à exécuter, ce qui peut laisser un mess. (Toujours de sauvegarde avant l'installation).
Liées à ce que Dave Markel a souligné, il y a des cas lors de l'analyse échoue parce que SQL Server est à la recherche dans le dictionnaire de données pour les objets qui sont créés plus tôt dans le lot, mais l'analyse peut se produire avant que toutes les instructions sont exécutées. Parfois c'est une question, parfois pas. Je ne peux pas venir avec un bon exemple. Mais si jamais vous avez un "X n'existe pas" d'erreur, quand c'est évident, existent par cette instruction break dans des lots.
Et une note finale. La Transaction peut s'étendre sur des lots. (Voir ci-dessus). Les Variables ne couvrent pas les lots.
declare @i int
set @i = 0
go
print @i
Msg 137, Level 15, State 2, Line 1
Must declare the scalar variable "@i".
ALLER extrémités d'un lot, vous n'aurez que très rarement besoin de l'utiliser dans le code. Sachez que si vous l'utilisez dans une procédure stockée, pas de code après le GO sera exécutée lorsque vous exécutez le proc.
De début et de FIN sont nécessaires pour tout type procédurale des états avec multipe lignes de code à traiter. Vous en aurez besoin pour les boucles WHILE et les curseurs (qui vous permettra d'éviter si possible bien sûr) et SI les déclarations (bien techniquement vous n'avez pas besoin d'eux pour un SI de tresorerie qui ne dispose que d'une seule ligne de code, mais il est plus facile de maintenir le code si vous avez toujours mis dans après un SI). CAS des déclarations aussi utiliser une FIN, mais n'ont pas de COMMENCER.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.