2016-06-03 2 views
1

YYYYMM의 정수 형식을 반환하는 UDF를 만들고 싶습니다. 그래서 월에 몇 가지 항목을 쉽게 분할 할 수 있습니다. 이 함수는 PERSISTED 계산 된 열의 값을 할당하려고합니다.SQL Server FORMAT를 결정적으로 만들 수 있습니까?

나는 현재 잘 작동 다음,이 :

CREATE FUNCTION dbo.GetYearMonth(@pDate DATETIME2) 
RETURNS INT 
WITH SCHEMABINDING 
AS 
BEGIN 
     DECLARE @fYear VARCHAR(4) = RIGHT('0000' + CAST(YEAR(@pDate) AS VARCHAR),4) 
     DECLARE @fMonth VARCHAR(2) = RIGHT('00' + CAST(MONTH(@pDate) AS VARCHAR),2) 

     RETURN CAST(@fYear + @fMonth AS INT) 
END 

을하지만 대신 FORMAT를 사용하는 청소기 생각합니다. 나는 이것을 시도했다 :

CREATE FUNCTION dbo.GetYearMonth(@pDate DATETIME2) 
RETURNS INT 
WITH SCHEMABINDING 
AS 
BEGIN 
     DECLARE @fYear VARCHAR(4) = FORMAT(@pDate,'yyyy', 'en-us') 
     DECLARE @fMonth VARCHAR(2) = FORMAT(@pDate,'MM', 'en-us') 

     RETURN CAST(@fYear + @fMonth AS INT) 
END 

그러나이 기능은 비 결정적이다. 결정적인 방법이 있습니까? FORMAT? 아니면 UDF를 결정적으로 만드는 더 좋은 방법이 있습니까?

+0

계산 열에 함수를 사용할 예정입니까? – FLICKER

+0

@FLICKER 예, 그렇습니다. 지속 된 것. – Matthew

+0

제 대답을 참조하십시오. 나도 왜 당신이 사용했는지 모른다. SCEHMEBINDING – FLICKER

답변

4

흥미로운 질문 그래서 뒷조사를하고 결정적인 아무것도 :

을 시작으로 내놓았다을 결정적 함수 및 비 결정적 함수

https://msdn.microsoft.com/en-us/library/ms178091(v=sql.110).aspx

모든 집계 및 문자열 내장 함수의

가 결정적 : 명시 적으로 목록 FORMAT을 나던하지만 상태.

링크 에 문자열 함수 다시

https://msdn.microsoft.com/en-us/library/ms181984(v=sql.110).aspx

이 페이지의 상태

모든 내장 문자열 함수 결정적이다. 즉, 특정 입력 값 집합을 사용하여 호출 할 때마다 동일한 값을 반환합니다.

그러나 FORMAT의 페이지는 주제에 대해 침묵합니다.

https://msdn.microsoft.com/en-au/library/hh213505(v=sql.110).aspx

FORMAT

은 ( https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.server.sqlfunctionattribute.isdeterministic(v=vs.110).aspx 따라) 결정되는 것을 배제하지 않는다 CLR을 사용하지만 DOCO 마지막 FORMAT

의 실제 구현과 같은 침묵이 의심하는 버그는 의사 (또는 코드)에서 빠른 검색 연결 (https://connect.microsoft.com/SQLServer) 아무 것도 드러내지 않습니다.

테스트 사례는 어떻습니까? (이 코드의 유효성에 대한 의견은 환영합니다 ...)

CREATE FUNCTION WhatAmI(@Number INTEGER) 
RETURNS NVARCHAR 
WITH SCHEMABINDING 
AS 
BEGIN 
RETURN FORMAT(@Number, 'd') 
END 
GO 

SELECT OBJECTPROPERTY(OBJECT_ID('WhatAmI'),'IsDeterministic') 

----------- 
0 

(1 row(s) affected) 

Nup, 그건 비 결정적입니다.

그래서 재미있는 운동이지만 결정적인 것은 없습니다.

그래서 우리는 (BOL에 따라) 무엇을 배웠습니까? 내장 함수가 비 결정적이라면 그렇게 할 방법이 없습니다. 일부는 매개 변수 유형에 따라 다르며 일부는 매개 변수 유형이 아닌 것으로 가정되지만 그렇지 않습니다.

2

나는 왜 당신이 기능을 사용하고 있는지 궁금해.

CONVERT(varchar(6), getdate(), 112) 
+0

나는 그것을 할 수 있는지 모른다. – Matthew

+1

이 코멘트는 내가 무엇을 찾고 있는지를 알려주지 만 특별히 질문에 답하지 않는다. upvoted하지만 받아들이지 않았다. – Matthew

1

Microsoft는 determinstic 될 수있는 형식의 기능에 대해 매우 분명하지 않다 : 당신은 간단한 공식을 사용할 수 있습니다. 해당 설명서의 주제에 대한 정보를 찾을 수 없습니다. CLR 기능을하는 것은 그것이 가능하지 않다는 것을 짐작합니다.

정수는 것입니다 원하는 방식으로 포맷 된 얻을 수있는 더 간단한 해결책 :

YEAR(@pDate) * 100 + MONTH(@pDate) 
+1

이 코멘트는 내가 찾고있는 것을 제공하지만 특별히 질문에 대답하지 않아서 나는 upvoted하지만 받아들이지 않았다. – Matthew

관련 문제