2016-03-03 33 views
1

我創建了兩個函數,一個是表值函數,另一個是標量值函數。在調用表值函數時,我不需要使用模式名稱,但是對於標量值函數,我需要模式。我的問題是爲什麼?因爲兩者都是用戶定義的功能。爲什麼我們只需要爲Scalar函數使用Schema名稱

表值函數

SELECT * FROM split ('1,2,3',',') 

標量值函數

SELECT dbo.GetESTDate() 
+0

一個是標量函數,另一個就像一個表。他們在sql server中是不同的對象。如果他們一致,但他們不一致,那將是很好的。老實說,無論如何,你應該使用模式來處理所有事情。 –

+0

強烈建議始終指定模式。 –

回答

0

這是Sql Server的規則。 即使您不需要爲TVF使用模式,請始終使用它!想象一下,有人在SQL Server中實現了內置的「拆分」功能,並且你的代碼將被破壞,因爲它將與內置的TVF相沖突。即使你不使用架構添加像ufn一些前綴。

+0

JocaPC:我可以理解,我們使用模式的一切,無論它是一個簡單的查詢表。即使我們使用模式名稱,它也會提高一些性能。其實我想知道爲什麼SVF不需要TVF。 –

0

你的問題是一個有趣的問題。實際上我不確定官方原因是什麼,但是我可以向你指出微軟的CREATE FUNCTION文檔,它實際上表明在調用標量函數時必須至少使用兩部分命名。

標量值函數必須通過至少使用函數的兩部分名稱來調用。 (Reference)

我會仔細研究一下,看看我是否無法獲得更多信息。你也讓我感興趣。

+0

我無法找到任何指出原因的特定信息。大多數人把它稱爲SQL Server怪癖。我猜測有一些內部工作可以在引用類似表格的對象(例如表,視圖和表值函數,因爲它們產生表格)而不是其他對象時,導致它可能省略模式名稱。對不起,我不能有任何幫助。 –

相關問題