2009-01-22 117 views
92

SQL Server 2005在我經常使用的系統目錄上有很好的sys.XXX視圖。SQL Server - 哪裏是「sys.functions」?

什麼讓我發現這是爲什麼有一個「sys.procedures」視圖來查看有關您的存儲過程的信息,但沒有「sys.functions」視圖來查看您的存儲功能相同?

沒有人使用存儲的函數嗎?我發現它們非常方便,例如計算列等!

是否有一個特定的原因sys.functions丟失,或者它只是被認爲是不夠重要的東西放入sys目錄視圖?它在SQL Server 2008中可用嗎?

乾杯, 馬克

+0

由TimC提供的答案(回答於1月22日14:06)優於使用較早的sysobjects系統表,因爲在INFORMATION_SCHEMA.ROUTINES中有一個LAST_ALTERED列,與列中的modify_date列相似sys.tables,sys.views,sys.procedures等。但是,如果您使用更新的sys.objects系統視圖,那麼您的modify_date與這些表中的一樣。我的$ 0.02。乾杯, - 馬修 – Maashu 2009-12-01 22:55:57

+1

@JuniorMayhe:好的 - 這裏是我輸入的[連接建議反饋](https://connect.microsoft.com/SQLServer/feedback/details/1127918) - 加快速度! :-) – 2015-02-13 12:09:01

+1

我認爲@marc_s有一個好點:很多人不明白爲什麼沒有`sys.functions`。你有`sys.foreign_keys`而不是`sys.primary_keys`。無論如何,我要求你們使用微軟的開放渠道來建議和推薦SQL Server上行版本的新功能,網址爲:https://connect.microsoft.com/SQLServer/Feedback我已經在https://上添加了關於sys.functions的反饋。 //connect.microsoft.com/SQLServer/feedback/details/1127920 – 2015-02-13 12:12:26

回答

102

我發現UDF非常方便,我一直都在使用它們。

我不確定微軟的基本原理是不包括SQL Server 2005(或SQL Server 2008,據我所知)的sys.functions等價物,但很容易推出自己的:

​​
6

這是非常稍微詳細,但這應該做同樣的事情:

select * from sys.objects where (type='TF' or type='FN') 

至於我可以看到,它不是在SQL Server 2008中無論是。

+1

是的,這正是我自己創建「sys_functions」視圖時所做的:-)只是想知道爲什麼它不在產品外面...... – 2009-01-22 17:34:21

+1

您錯過了'IF' – 2009-07-07 15:04:13

+0

...'FS'和'FT'。 – 2012-12-21 10:05:20

35

列出函數的另一種方法是利用INFORMATION_SCHEMA視圖。

SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION' 

據微軟的網站「信息架構視圖提供了SQL Server元。信息架構視圖使應用程序能夠正常工作,雖然顯著的變化已經對基礎系統進行的內部,系統表獨立意見表」。換句話說,底層的系統表可能會隨着SQL升級而改變,但視圖應該保持不變。

2

順便說一句,你不想包含type ='FS'?

name type type_desc 
getNewsletterStats FS CLR_SCALAR_FUNCTION 

這就是在sys.objects中的項目對應與我的UDF是從外部DLL導出

17

這是有效的在2008 R2每什麼SSMS生成,當你的腳本功能的下降:

SELECT * 
FROM sys.objects 
WHERE type IN (N'FN', N'IF', N'TF', N'FS', N'FT') ; 

/* 
From http://msdn.microsoft.com/en-us/library/ms177596.aspx: 
FN SQL_SCALAR_FUNCTION 
FS Assembly (CLR) scalar-function 
FT Assembly (CLR) table-valued function 
IF SQL_INLINE_TABLE_VALUED_FUNCTION 
TF SQL_TABLE_VALUED_FUNCTION 
*/ 
5

這不添加任何新的,但我發現下面的更容易記住:

select * from sys.objects where type_desc like '%fun%' 
2

要擴展@ LukeH的答案,要返回函數定義,還需要加入sys.sql_modules表。所以對此的查詢是:

SELECT O.name as 'Function name', M.definition as 'Definition', O.object_id 
FROM sys.objects as O INNER JOIN sys.sql_modules as M 
    ON O.object_id = M.object_id 
WHERE type IN ('FN', 'IF', 'TF') -- scalar, inline table-valued, table-valued 

其中上面分別顯示函數名稱,它的定義和對象標識符。

4

嘗試:

SELECT * FROM sys.objects 
where type_desc = 'SQL_SCALAR_FUNCTION' 
2

對於標量函數,包括所有者更完整的說明,並返回型:

SELECT f.name, s.name AS owner, t.name as dataType, p.max_length, p.precision, p.scale, m.definition 
FROM sys.objects f 
JOIN sys.schemas s on s.schema_id = f.schema_id 
JOIN sys.parameters p on p.object_id = f.object_id AND p.parameter_id = 0 
JOIN sys.types t ON t.system_type_id = p.system_type_id 
JOIN sys.sql_modules as m ON m.object_id = f.object_id 
WHERE type='FN'; 
0

SQL 2000爲對象名特定,輕微調整:

SELECT * 
FROM sysobjects 
WHERE type IN ('FN', 'IF', 'TF') 

SELECT * 
FROM dbo.sysobjects 
WHERE type IN ('FN', 'IF', 'TF')