Antes de publicar um item de conexão com relação à falta de documentação sobre isso, alguém confirmará que não estou simplesmente perdendo algo aqui?
Na página de documentos, onde format
está listada como uma função de sequência:
"Todas as funções internas de string são determinísticas." - Funções de sequência (Transact-SQL)
Também não há menção de format
ser não determinístico em páginas relacionadas:
No entanto, ao tentar criar uma coluna computada persistente:
create table t (date_col date);
insert into t values (getdate());
alter table t add date_formatted_01 as format(date_col,'YYYY') persisted;
Retorna o seguinte erro:
A coluna computada 'date_formatted_01' na tabela 't' não pode ser mantida porque a coluna é não determinística.
A documentação afirma que
Se o argumento de cultura não for fornecido, o idioma da sessão atual será usado.
mas adicionar um argumento de cultura não muda as coisas
Isso também falha
alter table t add date_formatted_02 as format(date_col, 'd', 'en-US' ) persisted
demonstração do rextester: http://rextester.com/ZMS22966
Demonstração do dbfiddle.uk: http://dbfiddle.uk/?rdbms=sqlserver_next&fiddle=7fc57d1916e901cb561b551af144aed6
fonte
alter table #t add date_formatted_01 as CONVERT(VARCHAR(20), FORMAT(date_col, 'YYYY', 'en-US')) persisted;
. Não sei por queFORMAT
não é determinista, especialmente ao especificar a cultura. Adate_formatted
coluna pode serVARCHAR(20)
(ainda persistida) e configurada via Trigger usandoFORMAT
. Ou o SQLCLR funciona. Usando a biblioteca SQL # SQLCLR (que eu escrevi), você pode fazerALTER TABLE SQL#.t ADD date_formatted_03 AS SQL#.Date_Format(date_col, 'd', 'en-US') PERSISTED;
(a tabela pertence ao SQL #, pois o proprietário da tabela e da função precisa ser o mesmo).Respostas:
Uma função não é necessariamente determinística ou não determinística. Existem algumas funções que podem ser determinísticas, dependendo de como são usadas :
CAST
eCONVERT
são esses exemplos. Com base nos testes que você fez até agora, acho justo dizer queFORMAT
nem sempre é determinístico, apesar de ser uma função de string. Se você quiser saber se às vezes é determinístico, a única técnica em que posso pensar é tentar maneiras diferentes de chamá-lo até que você esteja satisfeito. Por exemplo, vamos considerarFORMAT
como aplicado a números. Existem apenas dez tipos de entrada numéricos diferentes :Também parece haver apenas nove formatos numéricos diferentes . É possível tentar criar colunas persistentes para todas as combinações possíveis. Alguns códigos para fazer isso estão abaixo:
Aqui está uma amostra da saída:
Não consegui adicionar nenhuma coluna à tabela para alguns valores e culturas de entrada. Não tentei exaustivamente todas as culturas possíveis porque não consigo encontrar uma lista delas no SQL Server.
No mínimo, parece seguro concluir que a documentação referente ao determinismo de
FORMAT
está incorreta; portanto, eu recomendaria enviar um item de conexão para ele.fonte
A
FORMAT
documentação foi atualizada (em resposta ao seu item do Connect ) para dizer:Da mesma forma, as Funções de String (Transact-SQL) agora incluem:
fonte
Como não sou usuário regular do sqlserver, posso estar enganado, mas meu palpite é que o formato não é uma função de string. De acordo com a documentação:
https://docs.microsoft.com/en-us/sql/t-sql/functions/format-transact-sql
O formato aceita um tipo de data ou numérico como argumento. Se tudo o que você deseja fazer é pegar a parte do ano de uma data, você não pode usar a função ano?
se você deseja uma representação de string:
fonte