2011-03-05 2 views
10

"dbo"를 사용하지 않고 사용자 정의 함수를 호출하는 방법이 있습니까? 함수 이름과 매개 변수 앞에?"dbo"를 사용하지 않고 Microsoft SQL Server 쿼리에서 함수를 사용하는 방법이 있습니까? 함수 이전에?

사용 :

SELECT USERFUNCTION(PARAM1, PARAM2, PARAM3, PARAMN) 

대신 :이 SELECT 구문 수 없습니다

SELECT dbo.USERFUNCTION(PARAM1, PARAM2, PARAM3, PARAMN) 
+1

아니, 왜 귀찮음 ?? 스키마 접두어를 사용하고 프로그래밍 수명을 늘리십시오. –

+0

@marc_s "dbo"를 피할 수있는 좋은 이유입니다. 접두어는 다른 DBMS에 유효한 SQL 코드를 쓰는 것입니다. ' – bluish

+0

@bluish : OK -하지만 T-SQL/SQL Server에서 스키마 접두어 없이는 일반적으로 저장 함수를 호출 할 수 없습니다. –

답변

8

. BOL 상태 : "Scalar-valued functions must be invoked by using at least the two-part name of the function"

그러나이 구문은 작동합니다.

CREATE FUNCTION USERFUNCTION 
(@p INT) 
RETURNS INT 
AS 
BEGIN 
RETURN (2) 
END 

GO 

DECLARE @rc INT 

EXEC @rc = USERFUNCTION 1 

SELECT @rc 

이 가장 좋습니다 항상 스키마를 해결하기위한 약간의 오버 헤드를 피하기 (그리고 나는 또한 계획 캐시 이유로 생각)

+0

글쎄, 이것이 MySQL에서 할 수있는 기능을 사용할 수없는 이유입니다. , 감사. – alexzm1

+0

예 (계획 캐시의 경우) UserA와 UserB는 userA.table과 OtherSchema.table이있을 수 있기 때문에 동일한 스키마를 사용하지 않을 것입니다. – gbn

2

이 작업을 수행하는 다양한 방법이있다 할지라도 어쨌든 참조하는 객체를받을 스키마 , 우리가 그것을 취하면 당신은 "dbo."를 보는 부정적인 반응을 보입니다.

SQL Server 2000에는 비트 전환을 통해 UDF를 시스템 기능으로 변환 할 수있는 방법이 있습니다. 이 "기능"은 SQL Server 2005에서 제거되었으므로 아직 2000을 사용하지 않는 한 자세히 설명하지는 않겠습니다.

OPENQUERY를 Martin과 비슷한 PROC 구문으로 사용할 수 있습니다.

스칼라 함수를 다시 작성하거나 TVF에 래핑하여 테이블 반환 함수로 설정할 수 있습니다. 구문은 그렇게하지만

select dbo.udf(a,b) from c 

--becomes 
select d 
from c 
cross apply tvf(a,b) e(d) -- look, no "dbo"! 

을 변경하지만, 위의 어느 것도 단순한 시침보다 간단 보지 않는다 "DBO를." 접두사를 함수 이름에 붙여야합니다. 왜 그렇게할까요?

+0

Microsoft SQL Server 2005를 사용하고 있으며 사용자 정의 함수를 직접 전달하려고합니다. MySQL 5.0 이상에서는 DBMS 간의 차이점을 확인하기 시작했습니다. – alexzm1

+1

@alex 다음에는 더 많은 차이가 있습니다. 행복한 전이 – RichardTheKiwi

+0

이 하드 전이에 대한 귀하의 소망에 감사드립니다. @ 리차드 – alexzm1

0

예 가능, 실제로 스칼라 값을 반환하는 함수는 dbo.yourfunction과 같은 스키마 이름으로 호출해야합니다. 스키마 이름없이 함수를 호출하지 않으려면 다음과 같이 함수를 작성해야합니다.

샘플 코드 :

CREATE FUNCTION [dbo].[FN_MAPCOUNT] 
(

    @countValue int 
) 
RETURNS @TEMPTABLE Table(cntValue int) 
as 
begin 
    DECLARE @countValueint 
    @countValue= select count(*) from mappings; 

    INSERT @TEMPTABLE (cntValue) VALUES (@countValue) 
    RETURN 
end 
Go 

select * from FN_MAPCOUNT(1); 

이유는 당신이 테이블로 값을 반환하는 것입니다.

관련 문제