Eu encontrei uma diferença de comportamento em um pedaço de código entre os níveis de compatibilidade de banco de dados e me perguntei qual é a causa disso. Abaixo está um exemplo simples que itera através de uma tabela de contagem e altera a ROWCOUNT
opção na 50ª iteração:
Configurar:
/* Create tally table */
SELECT TOP 100
ROW_NUMBER() OVER (ORDER BY a.object_id) AS Number
INTO #Tally
FROM sys.objects a
CROSS JOIN sys.objects b;
/* Create Some databases with different compatibility levels */
CREATE DATABASE [100Compat] WITH COMPATIBILITY_LEVEL = 100
CREATE DATABASE [110Compat] WITH COMPATIBILITY_LEVEL = 110
CREATE DATABASE [120Compat] WITH COMPATIBILITY_LEVEL = 120
CREATE DATABASE [130Compat] WITH COMPATIBILITY_LEVEL = 130
O código afetado:
/* cursor through the tally table */
DECLARE MyCursor CURSOR
FOR
SELECT Number
FROM #Tally
FOR READ ONLY;
DECLARE @num INT;
OPEN MyCursor
FETCH MyCursor
INTO @num
WHILE @@FETCH_STATUS = 0
BEGIN
SET ROWCOUNT 0
/* change the value for ROWCOUNT on iteration 50 */
IF @num = 50 SET ROWCOUNT 1
PRINT @num
FETCH MyCursor
INTO @num
END
SET ROWCOUNT 0
CLOSE MyCursor
DEALLOCATE MyCursor
Se eu executar o acima [100Compat]
, ele imprime os números de 1 a 100 na janela de mensagens.
Se eu executar o acima [110Compat]
, [120Compat]
ou [130Compat]
posso ver os valores 1-50 na janela de mensagens e a mensagem de erro
Msg 16958, Level 16, State 3, Line 41 Não foi possível concluir a operação do cursor porque as opções definidas foram alteradas desde que o cursor foi declarado.
qual a diferença entre os dois modos de compatibilidade que causa essa mudança de comportamento? Existe um sinalizador de rastreamento que foi ativado/desativado em 110 ou algo semelhante?
Eu olhei para este artigo, mas nada parece óbvio sobre o que causa a diferença
O SQL Server 2012 introduziu uma alteração importante em SET ROWCOUNT :
Essa alteração é controlada pelo nível de compatibilidade do banco de dados, conforme demonstrado pelo script de reprodução. O nível de compatibilidade 110 (SQL 2012) ou superior resultará em um erro quando a
ROWCOUNT
configuração for alterada após a declaração do cursor.