대부분의 주된 이유는 테이블 반환 함수가 테이블 및 뷰와 마찬가지로 결과 집합을 반환하기 때문입니다. 이는 , 및 의 등을 FROM
포함하여 ,JOIN
APPLY
SELECT
UPDATE
및 DELETE
쿼리. 그러나 이러한 상황에서는 Scalar UDF를 사용할 수 없습니다.
둘째, EXECUTE
스칼라 UDF도 가능합니다. 이 구문은 입력 매개 변수에 지정된 기본값이있을 때 매우 유용합니다. 예를 들어 다음 UDF를 사용하십시오.
CREATE FUNCTION dbo.OptionalParameterTest (@Param1 INT = 1, @Param2 INT = 2)
RETURNS INT
AS
BEGIN
RETURN @Param1 + @Param2;
END;
입력 매개 변수를 "선택적"으로 취급 DEFAULT
하려면 서명이 고정 되어 있으므로 키워드를 함수처럼 호출 할 때 키워드 를 전달해야합니다 .
DECLARE @Bob1 INT;
SET @Bob1 = dbo.OptionalParameterTest(100, DEFAULT);
SELECT @Bob1;
-- Returns: 102
반면에 EXECUTE
함수 인 경우 저장 프로 시저에서와 같이 기본값을 가진 매개 변수를 실제로 선택적으로 처리 할 수 있습니다. 매개 변수 이름을 지정하지 않고 첫 번째 n 매개 변수를 전달할 수 있습니다 .
DECLARE @Bob2 INT;
EXEC @Bob2 = dbo.OptionalParameterTest 50;
SELECT @Bob2;
-- Returns: 52
저장 프로 시저와 마찬가지로 매개 변수 이름을 다시 지정하여 첫 번째 매개 변수를 건너 뛸 수도 있습니다.
DECLARE @Bob3 INT;
EXEC @Bob3 = dbo.OptionalParameterTest @Param2 = 50;
SELECT @Bob3;
-- Returns: 51
최신 정보
왜 EXEC
저장 프로 시저와 같이 구문 을 사용하여 스칼라 UDF를 호출 할 수 있습니까? 경우에 따라 쿼리에 추가하고 반환 된 행 집합을 조작 할 수 있기 때문에 UDF로 사용하기에 적합한 UDF가있을 수 있습니다. 반면에 코드가 저장 프로 시저에있는 경우에는 일련의 행을 반복합니다. 그러나 다른 UDF 내에서 단일 값으로 해당 함수를 호출하려는 경우가 있습니다. 단일 값에 대한 UDF 호출은 다음 중 하나로 수행 할 수 있습니다.
SELECT dbo.UDF('some value');
이 경우 결과 집합에서 반환 값을 얻습니다 (결과 집합이 작동하지 않음). 또는 다음과 같이 수행 할 수 있습니다.
DECLARE @Dummy INT;
SET @Dummy = dbo.UDF('some value');
이 경우 @Dummy
변수 를 선언해야 합니다.
그러나 EXEC
구문을 사용하면 이러한 성가심을 모두 피할 수 있습니다.
EXEC dbo.UDF 'some value';
또한 스칼라 UDF는 실행 계획을 캐시합니다. 이는 UDF에 실행 계획이있는 쿼리가있는 경우 매개 변수 스니핑 문제가 발생할 수 있음을 의미합니다. EXEC
구문 을 사용할 수있는 시나리오의 경우 WITH RECOMPILE
옵션을 사용하여 해당 실행에 대한 계획 컴파일 된 값을 무시할 수도 있습니다. . 예를 들면 다음과 같습니다.
설정:
GO
CREATE FUNCTION dbo.TestUDF (@Something INT)
RETURNS INT
AS
BEGIN
DECLARE @Ret INT;
SELECT @Ret = COUNT(*)
FROM sys.indexes si
WHERE si.[index_id] = @Something;
RETURN @Ret;
END;
GO
테스트:
DECLARE @Val INT;
SET @Val = dbo.TestUDF(1);
SELECT @Val;
EXEC @Val = dbo.TestUDF 0 -- uses compiled value of (1)
SELECT @Val;
EXEC @Val = dbo.TestUDF 0 WITH RECOMPILE; -- uses compiled value of (0)
SELECT @Val;
EXEC @Val = dbo.TestUDF 3 -- uses compiled value of (1)
SELECT @Val;