Quand dois-je besoin d'utiliser de Début / Fin de bloc et le mot clé dans SQL Server?
Quelqu'un peut-il me dire quand et où j'ai besoin d'utiliser begin
et end
blocs dans SQL Server?
Aussi, exactement ce que fait le Go
mot-clé le faire?
Vous devez vous connecter pour publier un commentaire.
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 liés à 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...
Vous devez COMMENCER ... FIN pour créer un bloc couvrant plus d'une instruction. Donc, si vous voulais faire 2 choses en une "jambe" d'une instruction if, ou si vous voulez faire plus d'une chose dans le corps d'une boucle WHILE, vous auriez besoin de support de ces déclarations avec BEGIN...END.
Le GO mot clé n'est pas une partie de SQL. Il est uniquement utilisé par l'Analyseur de Requêtes pour diviser les scripts en "lots" qui sont exécutés de manière indépendante.
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:
parce que toto n'existe pas pour le lot qui ne le CREATE TABLE. Vous devez faire ceci:
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.
Sur SQL Server 2000, l'erreur est:
Sur SQL Server 2005, l'erreur est moins utile:
Ainsi, l'utilisation de
GO
pour séparer les déclarations 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:
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.
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.
Après avoir lutté avec ce problème aujourd'hui, mon avis est-ce:
BEGIN...END entre parenthèses le code, tout comme {....} dans C langues, par exemple les blocs de code pour de if...else et boucles
GO est (doit être) utilisé lors de réussir énoncés se fondent sur un objet défini par une instruction précédente. L'UTILISATION de la base de données est un bon exemple ci-dessus, mais les suivantes seront également vous mordre:
Il me semble que le problème est le suivant: le Serveur SQL SQL de l'Analyseur, à la différence de l'Oracle, est incapable de réaliser que vous êtes à la définition d'un nouveau symbole sur la première ligne et que c'est ok de référence dans les lignes suivantes. Il ne veut pas "voir" le symbole jusqu'à ce qu'il rencontre un ALLER jeton qui lui demande d'exécuter le SQL précédente depuis le dernier rendez-vous, à quel point le symbole est appliqué à la base de données et qui devient visible à l'analyseur.
Pourquoi il ne se contente pas de traiter le point-virgule comme une sémantique de pause et d'appliquer des déclarations individuellement, je ne sais pas et souhaitons qu'il le ferait. Seul bonus, je peux voir, c'est que vous pouvez mettre un print() déclaration juste avant de le PASSER et si l'un des états échec de l'impression ne sera pas exécuté. Beaucoup de mal pour un mineur de gain si.