T-SQL-기본 매개 변수가있는 기능


155

나는이 스크립트를 가지고있다 :

CREATE FUNCTION dbo.CheckIfSFExists(@param1 INT, @param2 BIT = 1 )
RETURNS BIT
AS
BEGIN
    IF EXISTS ( bla bla bla )
        RETURN 1;
    RETURN 0;
END
GO

이 방법으로 절차에 사용하고 싶습니다.

IF dbo.CheckIfSFExists( 23 ) = 0
    SET @retValue = 'bla bla bla';

하지만 오류가 발생합니다.

프로 시저 또는 함수 dbo.CheckIfSFExists에 대해 충분한 수의 인수가 제공되지 않았습니다.

왜 작동하지 않습니까?

답변:


227

당신은 이것을 이렇게 불러야합니다

SELECT dbo.CheckIfSFExists(23, default)

에서 윈스 테크넷 :

함수의 매개 변수에 기본값이있는 경우, 기본값을 검색하려면 함수를 호출 할 때 키워드 DEFAULT를 지정해야합니다. 이 동작은 매개 변수를 생략해도 기본값을 암시하는 저장 프로 시저에서 기본값으로 매개 변수를 사용하는 것과 다릅니다. EXECUTE 문을 사용하여 스칼라 함수를 호출 할 때이 동작의 예외입니다. EXECUTE를 사용할 때는 DEFAULT 키워드가 필요하지 않습니다.


80
나는 이것을보고 좌절했다. 나는 default여기서 개념의 이점을 얻지 못한다 ... 나는 지금 모든 장소를 가서 변화시켜야한다.
LCJ

8
@ Lijo, 당신은 여전히 ​​각 호출에서 구체적인 기본값을 복제하지 않는 이점을 얻습니다.
Frédéric

9
오버레이가 허용되지 않고 "기본"으로 인해 사용성이 제한되었으므로 가장 좋은 방법은 추가 매개 변수를 사용하여 접미사 (예 : CheckIfSFExistsEX)를 사용하여 새 확장 버전을 만들고 원래 기능을 "default"매개 변수를 사용하여 확장 버전 호출 이렇게하면 기존의 모든 코드가 작동하며 유지 관리 할 위치가 한 곳뿐입니다.
Eske Rahn

39

매개 변수, DEFAULT 및 EXECUTE를 통해 세 가지 방법으로 호출 할 수 있습니다.

SET NOCOUNT ON;

DECLARE
@Table  SYSNAME = 'YourTable',
@Schema SYSNAME = 'dbo',
@Rows   INT;

SELECT dbo.TableRowCount( @Table, @Schema )

SELECT dbo.TableRowCount( @Table, DEFAULT )

EXECUTE @Rows = dbo.TableRowCount @Table

SELECT @Rows

11
DEFAULT키워드가 선택에 필요하지만 실행에서 생략 할 수 있습니까? 이것은 짜증나 : / 바라건대 언젠가 고쳐질 것입니다.
Misiu

@Misiu, "고정"될 필요는 없습니다. 의도적으로 설계된 것입니다. 나는 모든 인수를 지정하지 않고 단순히 함수를 호출 할 수 있다는 "이상적인"목표에 접근하기위한 많은 대안을 읽었지만 그것이 왜 필요한지에 대한 명확한 설명을 보지 못했습니다. 코드는 명확해야하며이를 달성하기위한 전략 중 하나는 코더가 항상 "이러한 기능을 호출하는 함수와이 다른 인수를 갖는 함수를 호출하는 것입니다. 기본값을 갖습니다. 기본값은 변경 될 수 있습니다 ". IMO, 이것은 좋은 "나쁜 것"입니다.
Gustavo Pinsard

16

사용자 정의 함수를 사용하면 기본값이 있더라도 모든 매개 변수를 선언해야합니다.

다음은 성공적으로 실행됩니다.

IF dbo.CheckIfSFExists( 23, default ) = 0
    SET @retValue = 'bla bla bla;

-1

이 문제점을 해결하는 한 가지 방법은 출력 매개 변수와 함께 스토어드 프로 시저를 사용하는 것입니다.

exec sp_mysprocname @ 반환 값 출력, @firstparam = 1, @ secondparam = 2

저장 프로 시저 자체에 설정된 기본값으로 기본값을 전달하지 않는 값. 그리고 출력 변수에서 결과를 얻을 수 있습니다.


1
저장 프로시 저는 쿼리 내에서 호출 할 수 없지만 함수는 저장 프로 시저로 변경하는 것이 일반적으로 좋은 해결책이 아닙니다.
Blade

그러나 모든 코드 블록을 쿼리 내에서 호출 할 필요는 없습니다. sql에는 함수의 기본값을 처리하는 좋은 방법이 없습니다 (기본 키워드를 사용하는 것은 값을 추가하는 것만큼이나 효과적입니다). 좋은 일반적인 해결책은 아니지만 특정 사용 사례에서 효과적입니다.
Jereme Guenther

사람들은 이것을 계속 표시하지만, 나는 그것을 고수하고 있습니다. 재사용 가능한 코드 청크가 필요하고 쿼리 내에서 호출되지 않으며 기본값을 가진 실제 선택적 매개 변수의 유연성을 원한다면 저장 프로 시저가 여전히 함수보다 낫습니다.
Jereme Guenther

1
저장 프로 시저를 사용한다고해서 함수를 사용하는 대신 저장 프로 시저를 사용한다는 의미는 아닙니다. 이는 저장 프로 시저를 함수 주위의 래퍼로 사용하는 것을 의미 할 수 있습니다. 이 기술을 자주 사용합니다. 기본 키워드는 이제 시저 내부에 숨겨져 있습니다. 이 아이디어는 괜찮다고 생각합니다. 또한 원하는 경우 더 복잡한 상태로 만들 수 있습니다. 함수와 분리되어 더 순수한 상태로 남을 수 있습니다.
J Bryan Price
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.