Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server:operador +(unário) em Strings não numéricas


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.