Meu script contém várias palavras- GO
chave. Eu sei que o SQLCMD interpreta GO
como um delimitador de lote, portanto, o código não é executado como um único bloco, mas cada parte entre os delimitadores (um lote) é executada separadamente. Minha pergunta é, todos os lotes são executados na mesma sessão?
Eu tentei testar isso usando um script simples como este:
SELECT @@SPID
GO
SELECT @@SPID
GO
SELECT @@SPID
GO
Em seguida, executei o script na linha de comando usando este comando
SQLCMD -S MyServer\Instance -E -i MyScript.sql
e obtive esta saída:
------
62
(1 rows affected)
------
62
(1 rows affected)
------
62
(1 rows affected)
Parecia responder minha pergunta de forma afirmativa, mas depois executei o script novamente e obtive exatamente a mesma saída, ou seja, todos os valores foram 62
novamente. Aparentemente, as duas execuções separadas do SQLCMD não poderiam ser executadas na mesma sessão, elas apenas receberam o mesmo ID de sessão. Mas isso, por sua vez, me faz pensar que o mesmo @@SPID
valor retornado por uma única execução pode não significar necessariamente que foi a mesma sessão. Cada lote pode ser executado em uma sessão diferente que acabou de receber o mesmo ID, semelhante a como diferentes execuções do SQLCMD estavam sendo executadas em diferentes sessões com o mesmo ID.
Portanto, minha pergunta ainda permanece: vários lotes do mesmo script são executados no SQLCMD na mesma sessão ou não? Existe uma maneira de determinar isso?
Você deve poder verificar se todos os lotes em um único
SQLCMD
script são executados na mesma sessão criando uma#temp
tabela local na parte superior doSQLCMD
script e tentando fazer referência a essa tabela temporária em lotes subsequentes. Como o escopo de uma tabela temporária local termina quando a sessão termina, se os lotes subsequentes estivessem realmente sendo executados em sessões diferentes (mesmo que o id fosse o mesmo), você obteriatable not found
erros.