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 :
As funções a seguir nem sempre são determinísticas, mas podem ser usadas em visualizações indexadas ou índices em colunas computadas quando especificadas de maneira determinística.
CASTe CONVERTsão esses exemplos. Com base nos testes que você fez até agora, acho justo dizer que FORMATnem 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 considerar FORMATcomo 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:
DECLARE @FormatValue INT = 76767; -- change this if you want
DECLARE @FormatCulture VARCHAR(10) = 'en-US'; -- change this if you want
DECLARE @Format VARCHAR(1);
DECLARE @FormatType VARCHAR(10);
DECLARE @SQLForColumn VARCHAR(200);
DECLARE @TestNumber INT = 0;
BEGIN
DROP TABLE IF EXISTS dbo.TargetTable;
CREATE TABLE dbo.TargetTable (ID INT);
DROP TABLE IF EXISTS #ColumnAddResults;
CREATE TABLE #ColumnAddResults (
FormatType VARCHAR(10),
[Format] VARCHAR(1),
Succeeded VARCHAR(1),
ErrorMessage VARCHAR(1000)
);
drop table if exists #Types;
create table #Types (FormatType VARCHAR(10));
INSERT INTO #Types VALUES
('bigint'), ('int'), ('smallint'), ('tinyint'), ('decimal')
, ('numeric'), ('float'), ('real'), ('smallmoney'), ('money');
drop table if exists #Formats;
create table #Formats ([Format] VARCHAR(1));
INSERT INTO #Formats VALUES
('C'), ('D'), ('E'), ('F'), ('G'), ('N'), ('P'), ('R'), ('X');
DECLARE format_statements CURSOR LOCAL FAST_FORWARD FOR
SELECT #Types.FormatType, #Formats.[Format]
FROM #Formats
CROSS JOIN #Types;
OPEN format_statements;
FETCH NEXT FROM format_statements
INTO @FormatType, @Format;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @TestNumber = @TestNumber + 1;
SET @SQLForColumn = 'alter table dbo.TargetTable add NewColumn' + CAST(@TestNumber AS VARCHAR(10))
+ ' as FORMAT(CAST(' + CAST(@FormatValue AS VARCHAR(10)) + ' AS ' + @FormatType + '), '
+ '''' + @Format + ''', ''' + @FormatCulture + ''') persisted';
BEGIN TRY
EXEC (@SQLForColumn);
INSERT INTO #ColumnAddResults VALUES (@FormatType, @Format, 'Y', NULL);
END TRY
BEGIN CATCH
INSERT INTO #ColumnAddResults VALUES (@FormatType, @Format, 'N', ERROR_MESSAGE());
END CATCH;
PRINT @SQLForColumn;
FETCH NEXT FROM format_statements
INTO @FormatType, @Format;
END;
CLOSE format_statements;
DEALLOCATE format_statements;
SELECT * FROM dbo.TargetTable;
SELECT * FROM #ColumnAddResults;
DROP TABLE #ColumnAddResults;
END;
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 FORMATestá incorreta; portanto, eu recomendaria enviar um item de conexão para ele.
alter table #t add date_formatted_01 as CONVERT(VARCHAR(20), FORMAT(date_col, 'YYYY', 'en-US')) persisted;. Não sei por queFORMATnão é determinista, especialmente ao especificar a cultura. Adate_formattedcoluna 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).