함수가 반드시 결정적이거나 비 결정적이지는 않습니다. 사용 방법에 따라 결정적 일 수있는 몇 가지 기능이 있습니다 .
다음 함수는 항상 결정적인 것은 아니지만 계산 된 열이 결정적인 방식으로 지정된 경우 계산 된 열의 인덱스 된 뷰 또는 인덱스에서 사용할 수 있습니다.
CAST와 CONVERT같은 예이다. 지금까지 수행 한 테스트를 기반으로 FORMAT문자열 함수 임에도 불구하고 항상 결정적이지 않다고 말하는 것이 공정하다고 생각 합니다. 때로는 결정 론적 인 것인지 알고 싶다면 내가 생각할 수있는 유일한 기술은 만족할 때까지 다른 방법으로 호출하는 것입니다. 예를 들어, FORMAT숫자에 적용되는 것으로 간주합시다 . 숫자 입력 유형 은 10 가지뿐입니다 .

또한 9 가지 숫자 형식 만있는 것으로 보입니다 . 가능한 모든 조합에 대해 지속적인 열을 만들 수 있습니다. 이를 수행하는 일부 코드는 다음과 같습니다.
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;
다음은 출력 샘플입니다.

몇 가지 입력 값과 문화를 위해 테이블에 추가 할 열을 얻을 수 없었습니다. SQL Server에서 해당 문화권 목록을 찾을 수 없기 때문에 가능한 모든 문화권을 철저히 시도하지는 않았습니다.
최소한 결정론에 관한 문서 FORMAT가 잘못 되었다는 결론을 내리는 것이 안전 하므로 연결 항목을 제출하는 것이 좋습니다.
alter table #t add date_formatted_01 as CONVERT(VARCHAR(20), FORMAT(date_col, 'YYYY', 'en-US')) persisted;.FORMAT특히 문화를 지정할 때 왜 결정적이지 않은지 잘 모르겠습니다 .date_formatted컬럼 할 수VARCHAR(20)(정지 유지) 및 사용 트리거로 설정FORMAT. 또는 SQLCLR이 작동합니다. 은 Using SQL # (내가 쓴), 당신이 할 수있는 SQLCLR 라이브러리ALTER TABLE SQL#.t ADD date_formatted_03 AS SQL#.Date_Format(date_col, 'd', 'en-US') PERSISTED;(테이블은 테이블 및 기능 소유자 필요하기 때문에 SQL 번호로 소유하는 것은 동일합니다).