2013-09-24 4 views
2

Coalesce는 매개 변수의 모든 수인 과 함께 작동하고 null이 아닌 첫 번째를 반환하는 것으로 보입니다. 어떻게 그런 함수를 작성할 수 있습니까? 고정 된 수의 매개 변수가없는 매개 변수?SQL 서버에 any-number-of-params 함수를 작성하는 방법

함수 FMAX의 사용의 예 :

select Length = (
    select MAX(side) 
    from (values (box.Height), (box.Width), (box.Depth)) as sides(side)) 
from dbo.tBox box 
where box.ShipmentId = 1234 
+0

그냥 합체를 사용합니까? –

+0

T-SQL에 쓸 수 없습니다. 확장 저장 프로 시저 (예 : C)를 작성하는 경우 알 수없는 매개 변수 수를 허용 할 수 있다고 생각하지만 향후이 기능에 대한 지원이 사라지고 기능과 동일하지 않습니다 (구성 할 수 없습니다). 더 큰 쿼리) –

+2

당신이 당신의 질문에서 읽을 수있는만큼 병합이 이루어져야하므로 달성하려는 것을 보여주는 샘플을 보여줄 수 있습니까? – Tanner

답변

0

불행히도 이것을 시도한 후에 COALESCE과 같은 기능을 T-SQL에 쓸 수 없다고 확신합니다.

CLR-Functions을 사용하면 C#에 코드 예를 들어 SQL Server의 일부 기능을 보완 할 수 있다고 확신했습니다. 그러나 아래의 주석에 동의해야합니다. SQL에서 매개 변수 목록을 제공하여 새로운 기능을 도입 할 필요가 없도록 제한하지 않습니다.

간단히 말해서 T-SQL에서는 이러한 함수를 직접 코딩 할 수 없습니다.

+0

그러나 CLR UDF를 가져올 때 매개 변수 목록을 제공해야하므로이 두 개념을 결합 할 수 없습니다. –

+0

오, 정말? 나는 그저 나 자신을 시험해보기 시작했다. 이 시도는 유망 해 보였지만 SQL Server Management Studio는 단지 제공 만하면 불만을 토로합니다./ – DrCopyPaste

2

당신은 SQL Server 2008 및 이상 사용하는 경우 :

select Length = dbo.fMax(box.Height, box.Width, box.Depth) 
from dbo.tBox box 
where box.ShipmentId = 1234 

이러한 기능으로 I는 다음과 같이 작성할 필요가 없습니다 것입니다 Table-Valued Parameters을 사용할 수 있습니다.

0

다른 응답자들은 당신이 요구하는 것을 정확히 할 수 있다고 생각하지 않습니다.

그러나 기본 매개 변수를 사용하여 합리적인 근사를 만들 수 있다고 생각합니다. 당신이 합리적인 상한을 알고있는 경우이 같은 함수 뭔가를 정의 할 수 있습니다 :

--edit

당신이 UDF에 기본값을 가질 수 없습니다 밝혀졌습니다.

CREATE FUNCTION dbo.fMax 
(
    @Value1 float, 
    @Value2 float, 
    @Value3 float, 
    @Value4 float 
) 
RETURNS float 
AS 
BEGIN 
    DECLARE @Result float 

    SELECT @Value1 = COALESCE(@Value1, @Value2, @Value3, @Value4) 
    SELECT @Value2 = COALESCE(@Value2, @Value1, @Value3, @Value4) 
    SELECT @Value3 = COALESCE(@Value3, @Value1, @Value2, @Value4) 
    SELECT @Value4 = COALESCE(@Value4, @Value1, @Value2, @Value3) 

    SELECT @Result = @Value1 

    IF (@Value2 > @Result) 
    SELECT @Result = @Value2 

    IF (@Value3 > @Result) 
    SELECT @Result = @Value3 

    IF (@Value4 > @Result) 
    SELECT @Result = @Value4 

    RETURN @Result 
END 

과 전화 : 당신이 할 수있는 최선의 최대 매개 변수의 수와 기능을 가지고 의미 기능

를 호출 할 때 또는 오히려 당신이 그들을 정의 할 수 있습니다,하지만 당신은 여전히 ​​값을 지정해야 그것을 좋아해 :

SELECT dbo.fMax(1, 5, 4, null) 
+0

@ Value4에 null 기본값이 있더라도 세 개의 매개 변수가 있습니다. – Kristoffer

+0

편집 참조 - 선택적 값이 UDF에서 무시됩니다. :( –