Quando você diz a + b
em T-SQL e a
e b
são do tipo string (por exemplo , varchar(...)
ou nvarchar(...)
): Como o tipo resultante é determinado?
Não encontrei regras claras para isso ao experimentar. Parece depender se literais estão envolvidos.
Além disso, como o comprimento é determinado? Eu descobri que o tipo de 'x' + 'y'
é varchar(2)
. Aparentemente, o comprimento do literal está sendo rastreado.
Aqui está um pequeno experimento que fiz:
USE tempdb
DECLARE @v VARCHAR(400) = 'x'
DECLARE @n NVARCHAR(400) = 'x'
SELECT
'' AS [varchar]
, N'' AS [nvarchar]
, ('x' + N'x') AS ['x' + N'x']
, (N'x' + 'x') AS [N'x' + 'x']
, (ISNULL('x', N'x')) AS [ISNULL('x', N'x')]
, (ISNULL(N'x', 'x')) AS [ISNULL(N'x', 'x')]
, (COALESCE('x', N'x')) AS [COALESCE('x', N'x')]
, (COALESCE(N'x', 'x')) AS [COALESCE(N'x', 'x')]
, (@v + @n) AS [@v + @n]
, (@n + @v) AS [@n + @v]
, (ISNULL(@v, @n)) AS [ISNULL(@v, @n)]
, (ISNULL(@n, @v)) AS [ISNULL(@n, @v)]
, (COALESCE(@v, @n)) AS [COALESCE(@v, @n)]
, (COALESCE(@n, @v)) AS [COALESCE(@n, @v)]
INTO StringConversionTest
A documentação chama o comportamento de ISNULL
e COALESCE
então eu entendo essa parte. Mas o +
operador parece se comportar sob um conjunto mais complexo de regras.
Existem várias situações em que duas (ou mais) coisas distintas estão sendo combinadas e, no entanto, só pode haver um único resultado. Essas questões são resolvidas pela aplicação de um conjunto de regras de precedência. Nesse caso, ele usaria Precedência de tipo de dados e Precedência de agrupamento. Mas também há precedência lógica (ao combinar AND e OR sem parênteses) e como lidar com cálculos decimais de precisão variável, etc).
Precedência de tipo de dados
Precedência de agrupamento
Precisão, Escala e Comprimento
Relacionado: