Aqui está minha própria resposta a esta pergunta (veja também a atualização no final):
Não, não existe tal operador unário definido nas expressões String. É possível que isso seja um bug.
Explicação:
A declaração dada é válida e gera o resultado abaixo:
(No column name)
----------------
ABCDEF
(1 row(s) affected)
que é equivalente a fazer o
SELECT
declaração sem usar o +
sinal:SELECT 'ABCDEF'
Ser compilado sem dar nenhum erro, de fato sendo executado com sucesso, dá a impressão de que
+
está operando como um Unary
operação na string dada. No entanto, no T-SQL
oficial documentação, não há menção de tal operador. Na verdade, na seção intitulada "Operadores de string
", +
aparece em duas operações de String que são + (String Concatenation)
e += (String Concatenation)
; mas também não é um Unary
Operação. Além disso, na seção intitulada "Operadores Unários
", três operadores foram introduzidos, sendo apenas um deles o + (Positive)
operador. No entanto, para este único que parece ser relevante, logo fica claro que esse operador também não tem nada a ver com valores de string não numéricos como a explicação para + (Positive)
operador declara explicitamente que este operador é aplicável apenas para valores numéricos:"Retorna o valor de uma expressão numérica (um operador unário)
". Talvez este operador esteja lá para aceitar com sucesso aqueles valores de string que são avaliados com sucesso como números, como o que foi usado aqui:
SELECT +'12345'+1
Quando a instrução acima é executada, ela gera um número na saída que é a soma da string fornecida avaliada como um número e do valor numérico adicionado a ela, que é
1
aqui, mas obviamente poderia ser qualquer outro valor:(No column name)
----------------
12346
(1 row(s) affected)
No entanto, duvido que esta explicação seja a correta, pois levanta as seguintes questões:
Em primeiro lugar, se aceitarmos que esta explicação é verdadeira, podemos concluir que expressões como
+'12345'
são avaliados em números. Em caso afirmativo, então por que esses números podem aparecer nas funções relacionadas à string, como DATALENGTH
, LEN
, etc. Você pode ver uma declaração como esta: SELECT DATALENGTH(+'12345')
é bastante válido e resulta o seguinte:
(No column name)
----------------
5
(1 row(s) affected)
que significa
+'12345'
está sendo avaliado como uma string e não como um número. Como isso pode ser explicado? Em segundo lugar, enquanto declarações semelhantes com
-
operador, como este: `SELECT -'ABCDE'`
ou mesmo isso:
`SELECT -'12345'`
gere o erro abaixo:
Invalid operator for data type. Operator equals minus, type equals varchar.
Por que, não deveria gerar um erro para casos semelhantes quando
+
operador foi usado incorretamente com um valor de string não numérico? Então, essas duas perguntas me impedem de aceitar a explicação de que isso é o mesmo
+ (unary)
operador que foi introduzido na documentação para valores numéricos. Como não há outra menção a ele em nenhum outro lugar, pode ser que ele seja deliberadamente adicionado à linguagem. Pode ser um bug. O problema parece ser mais grave quando vemos que nenhum erro é gerado para instruções como esta:
SELECT ++++++++'ABCDE'
Não sei se existem outras linguagens de programação por aí que aceitam esse tipo de declaração. Mas se houver, seria bom saber para que propósito eles usam um
+ (unary)
operador aplicado a uma string. Não consigo imaginar nenhum uso! ATUALIZAÇÃO
Aqui diz que isso foi um bug em versões anteriores, mas não será corrigido devido à compatibilidade com versões anteriores:
Após alguma investigação, esse comportamento ocorre por design pois + é um operador unário. Portanto, o analisador aceita "+, e o '+' é simplesmente ignorado neste caso. Alterar esse comportamento tem muitas implicações de compatibilidade com versões anteriores, portanto, não pretendemos alterá-lo e a correção introduzirá alterações desnecessárias no código do aplicativo.