Published on

May 21, 2015

Compreendendo Erros de Sintaxe em Procedimentos do SQL Server

Já se deparou com uma situação em que um procedimento do SQL Server tinha erros de sintaxe, mas ainda assim funcionava sem problemas? Isso pode ser bastante confuso e frustrante, especialmente quando você está tentando fazer alterações no procedimento. Neste artigo, vamos explorar esse fenômeno e discutir como lidar com ele.

O Problema Real

Vamos começar olhando para o problema real. Considere o seguinte cenário:

USE AdventureWorks2012;
GO

DECLARE @String NVARCHAR(MAX);

-- Gerar uma string para criar um procedimento
SET @String = 'CREATE PROCEDURE cProcWithLongStrings AS SELECT ' + char(39)
+ REPLICATE ('A',200) + char (39) + ' as Primeiro,'
+ char(39) + REPLICATE('B',243) + char(39) + ' as Segundo,'
+ char(39) + REPLICATE('C',243) + char(39) + ' as Terceiro,'
+ char(39) + REPLICATE('D',243) + char(39) + ' as Quarto,'
+ char(39) + REPLICATE('E',243) + char(39) + ' as Quinto;';

-- Obtendo o script para criar o procedimento
PRINT @String;

-- Instalando o procedimento executando a string.
EXEC (@String);
GO

Neste exemplo, estamos criando um procedimento chamado “cProcWithLongStrings” com alguns valores de string longos para as colunas. Se você executar este código, notará que o procedimento é criado com sucesso, sem erros de sintaxe.

O Comportamento Inesperado

Agora, vamos tentar recuperar o texto do procedimento usando o procedimento armazenado do sistema “sp_helptext”:

-- Obtendo o procedimento criado usando sp_helptext
EXEC sp_helptext 'cProcWithLongStrings';
GO

Quando você executar este código, notará que o texto do procedimento é exibido, mas com erros de sintaxe. Isso é inesperado, pois o procedimento foi criado sem erros.

A Explicação

O motivo por trás desse comportamento está na forma como o procedimento “sp_helptext” funciona. Ele lê o texto da tabela “sys.syscomments” e adiciona uma nova linha após cada 255º caractere. No nosso caso, isso faz com que as palavras no procedimento sejam separadas, resultando em erros de sintaxe.

Para ilustrar isso, vamos dar uma olhada na saída de texto do procedimento:

CREATE PROCEDURE cProcWithLongStrings
AS
SELECT
  'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' as Primeiro
, 'BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.