Esta semana me perguntaram: "Renata, para que serve o comando 'GO' ao final de uma query?". Titubiei e nao consegui responder. Apenas disse: "E uma forma de comitar instrucoes que modificam estrutura do banco. Semelhante ao Commit que escreve o registro no arquivo de dados".Diante dessa resposta mal dada, resolvi procurar pelo site do MSDN.Sintaxe: GO [count]Sinaliza o termino de um lote de instrucoes Transact-SQL para os utilitarios SQL Server. O count define quantas vezes o lote acima do 'GO' deve ser executado.Num exemplo, se executo uma query para criacao de uma View e antes existe alguma outra instrucao como um 'USE [Banco]', sei que a solucao e colocar um 'GO' antes do 'Create View':Tentativa 1 - Um unico lote para escolha do banco de dados, criacao da view e select na viewComando:USE B_BANCOCREATE VIEW V_VIEW AS SELECT * FROM T_TABELASELECT * FROM V_VIEWResultado:Msg 111, Level 15, State 1, Line 3'CREATE VIEW' must be the first statement in a query batch.Tentativa 2 - Adicionei ';' para tentar separar os comandoComando:USE B_BANCO;CREATE VIEW V_VIEW AS SELECT * FROM T_TABELA;SELECT * FROM V_VIEW;Resultado:Msg 111, Level 15, State 1, Line 3'CREATE VIEW' must be the first statement in a query batch.Tentativa 3 - Inclusao do comando 'GO' para separar a query em dois lotesComando:USE B_BANCO;GOCREATE VIEW V_VIEW AS SELECT * FROM T_TABELA;SELECT * FROM V_VIEW;Resultado:Msg 170, Level 15, State 1, Procedure V_VIEW, Line 2Line 2: Incorrect syntax near ';'.Tentativa 4 - Ja conectada em B_BANCO, retirei o ';' e inclui 'GO' apos o create view, criando assim tres lotesComando:USE B_BANCO;GOCREATE VIEW V_VIEW AS SELECT * FROM T_TABELA;GOSELECT * FROM V_VIEW;Resultado:SQ_DET_CLD PC_VR----------- ---------------------------------------1 2.002 2.004 2.005 2.006 2.008 43.009 2.00(7 row(s) affected)Explicacao:- Na tentativa 1, temos tres instrucoes relacionadas e dependentes, por este motivo se encontram na mesma query. Porem, segundo o MSDN, Para CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE SCHEMA, CREATE TRIGGER e CREATE VIEW nao se pode combina-los com outras instrucoes em um mesmo lote.- Na tentativa 2, temos as mesmas instrucoes separadas por ponto e virgula que e uma convencao usada na linguagem SQL que em Transact-SQL nao e obrigatoria, porem tambem nao e errada. Mas em alguns comandos proprios da T-SQL nao podem ser usados.- Na tentativa 3, usando 'GO' depois do comando 'USE', o bloco de codigo foi separado entre dois lotes. Desta forma, o banco B_BANCO foi posicionado, porem a view nao foi criada por haver ";" ao final do comando Create View.- Ja na tentativa 4, a retirada do ';' e a inclusao do 'GO' ao final do comando 'Create View', separou a transacao em tres lotes possibilitando a criacao da view e exibicao do resultado pelo comando Select ao final.Apenas por curiosidade, tentei uma quinta tentativa:Tentativa 5 - Retirada do 'GO' apos o 'USE'Comando:USE B_BANCOCREATE VIEW V_VIEW AS SELECT * FROM T_TABELAGOSELECT * FROM V_VIEWResultado:Msg 111, Level 15, State 1, Line 4'CREATE VIEW' must be the first statement in a query batch.Msg 208, Level 16, State 1, Line 1Invalid object name 'V_VIEW'.Explicacao:Foram retornadas duas mensagens de erro pois existe ai dois lotes. O primeiro lote