2011-03-05 4 views
10

Kullanıcı tanımlı bir işlevi "dbo" kullanmadan çağırmanın bir yolu var mı? fonksiyon isminden ve parametrelerinden önce mi?Microsoft SQL Server Sorgusu'nda "dbo" kullanmadan bir işlevi kullanmanın bir yolu var mı? işlevden önce?

kullanma:

SELECT USERFUNCTION(PARAM1, PARAM2, PARAM3, PARAMN) 

yerine: Bu SELECT sözdizimi için mümkün değildir

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

Hayır. Neden rahatsız? Sadece şema önekini kullanın ve programlama hayatınıza geçin ... –

+0

@marc_s "dbo" dan kaçınmak için iyi bir neden. önek, farklı DBMS'ler için geçerli olan SQL kodunu yazıyor '. – bluish

+0

@bluish: Tamam - ama saklanan işlevler genellikle şema öneki olmadan çağrılmaz, T-SQL/SQL Server –

cevap

8

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

Bu sözdizimi çalışır.

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

GO 

DECLARE @rc INT 

EXEC @rc = USERFUNCTION 1 

SELECT @rc 

Bu noktada en iyi uygulama her zaman şema çözmeye ilişkin bazı ek yükü önlemek (ve ben de planı önbellek nedenlerle düşünüyorum)

+0

de öyle görünüyor ki bu MySQL'de yapabileceğim gibi bir işlevi kullanamıyorum cevabı bu gibi görünüyor , Teşekkürler. – alexzm1

+0

evet, plan önbellek nedenleriyle. UserA ve UserB şema niteliği olmadan aynı planı kullanmaz çünkü userA.table ve OtherSchema.table olabilir – gbn

2

Bunu yapmanın çeşitli yolları vardır için olsa yine başvuran nesneleri nitelemek şema Eğer alırsak, "dbo" görmeye olumsuz bir tepki verirsin.

SQL Server 2000'de, UDF'leri bir bit'i değiştirerek sistem işlevlerine dönüştürmenin bir yolu vardır. Bu "özellik", SQL Server 2005'ten kaldırılmıştır, bu nedenle hala 2000'i kullanmaya devam etmediğiniz sürece ayrıntıya girmeyeceğim.

Martin'in gösterdiği gibi PROC sözdizimi ile OPENQUERY kullanabilirsiniz.

Skaler işlevini yeniden yazarak veya TVF'ye kaydırarak Tablo Değerli İşlevine dönüştürebilirsiniz. sözdizimi kadar ki

select dbo.udf(a,b) from c 

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

değiştirir Ama yukarıdakilerden hiçbiri sadece basit teyel daha basit görünüyor "dbo." işlev isminin öneki, o zaman neden yapardınız?

+0

Microsoft SQL Server 2005 kullanıyorum ve kullanıcı tanımlı işlevleri doğrudan yapabildiğim gibi aktarmaya çalışıyorum MySQL 5.0+ ile ancak thos DBMS arasındaki farkları görmeye başlıyorum. – alexzm1

+1

@alex daha sonra karşılaşabileceğiniz daha fazla fark var. mutlu geçiş – RichardTheKiwi

+0

Bu zor geçişteki istekleriniz için teşekkürler @Richard – alexzm1

0

Evet Mümkün, Aslında işlev skaler değerini döndürdüğünde, dbo.yourfunction gibi şema adıyla çağırmanız gerekir, Şema adı olmadan işlev çağırmak istemiyorsanız, işlevi aşağıdaki gibi oluşturmanız gerekir.

Örnek Kod:

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); 

nedeni tablo olarak değerini dönüyor olduğunu.