Observei que os valores de chave-valor podem estar sem aspas quando numéricos em strings TSQL JSON, mas parece que o componente-chave deve sempre ser citado.
select 1, isjson(''), 'empty string' union
select 2, isjson('{}'), 'empty braces' union
select 3, isjson('{1:2}'), 'unquoted both, numerals both' union
select 4, isjson('{1:"2"}'), 'unquoted key, numerals both' union
select 5, isjson('{"1":2}'), 'unquoted value, numerals both' union
select 6, isjson('{"1":"2"}'), 'quoted both, numerals both' union
select 7, isjson('{a:b}'), 'unquoted both, alpha both' union
select 8, isjson('{a:"b"}'), 'unquoted key, alpha both' union
select 9, isjson('{"a":b}'), 'unquoted value, alpha both' union
select 10, isjson('{"a":"b"}'), 'quoted both, alpha both'
order by 1
;
Resultados:
1 0 empty string
2 1 empty braces
3 0 unquoted both, numerals both
4 0 unquoted key, numerals both
5 1 unquoted value, numerals both
6 1 quoted both, numerals both
7 0 unquoted both, alpha both
8 0 unquoted key, alpha both
9 0 unquoted value, alpha both
10 1 quoted both, alpha both
O acima demonstra isso, mas minhas perguntas são:
- Isso deve ser sempre assim? (Existe uma configuração que pode substituir esse comportamento?)
- Esse comportamento é especificado por JSON ou SQL Server?
- Qual é a lógica por trás dessa decisão de design?
- Haveria um benefício de desempenho se o SQL Server convertesse automaticamente numerais sem aspas como inteiros?
A definição de notação JSON segue o seguinte esquema:
A definição da string é a seguinte:
Você pode ver que as aspas são obrigatórias tanto no início quanto no final.
A definição do valor é a seguinte:
Observe que aqui você pode fornecer uma string ou um número , sendo o número :
Conclusões :
Não posso responder por que o JSON adotou esse esquema específico e uma resposta aqui pode ser baseada em opinião.
O SQL Server sempre obterá um aumento de desempenho ao tratar inteiros sobre tipos de dados de string (como
VARCHAR
ouNVARCHAR
), pois eles são mais rápidos para operar e comparar, mas certifique-se de que o tipo de dados seja realmente um tipo numérico e não um número armazenado como uma string.