SQL Server - di mana "sys.functions"?

104

SQL Server 2005 memiliki tampilan sys.XXX yang bagus pada katalog sistem yang sering saya gunakan.

Apa yang membuat saya tersandung: mengapa ada tampilan "sys.procedures" untuk melihat info tentang prosedur tersimpan Anda, tetapi tidak ada tampilan "sys.functions" untuk melihat hal yang sama untuk fungsi yang Anda simpan?

Apakah tidak ada yang menggunakan fungsi tersimpan? Saya menemukan mereka sangat berguna untuk misalnya kolom yang dihitung dan semacamnya!

Apakah ada alasan tertentu mengapa sys.functions tidak ada, atau apakah itu hanya sesuatu yang dianggap tidak cukup penting untuk dimasukkan ke dalam tampilan katalog sys ?? Apakah tersedia di SQL Server 2008 ??

Bersulang, Marc

marc_s
sumber
Jawaban yang diberikan oleh TimC (menjawab 22 Jan pada 14:06) lebih disukai daripada menggunakan tabel sistem sysobjects yang lebih lama, karena Anda memiliki kolom LAST_ALTERED di INFORMATION_SCHEMA.ROUTINES yang mirip dengan kolom modifikasikan tanggal yang ada di sys.tables, sys.views, sys.procedures, dll. Namun, jika Anda menggunakan tampilan sistem sys.objects yang lebih diperbarui, Anda harus memodifikasi_date seperti pada tabel tersebut. $ 0,02 saya. Cheers, -Matthew
Maashu
1
@JuniorMayhe: oke - ini masukan saran Connect yang saya masukkan - naikkan voting ! :-)
marc_s
1
Saya pikir @marc_s memiliki poin yang bagus: banyak orang tidak mengerti mengapa tidak ada sys.functions. Anda punya sys.foreign_keysdan tidak sys.primary_keys. Bagaimanapun, saya meminta kalian untuk menggunakan saluran terbuka Microsoft untuk mengusulkan dan menyarankan fitur-fitur baru untuk versi upcomming dari SQL Server di connect.microsoft.com/SQLServer/Feedback Saya telah menambahkan umpan balik mengenai sys.functions di connect.microsoft.com/ SQLServer / feedback / details / 1127920
Junior Mayhé

Jawaban:

117

Saya menemukan UDF sangat berguna dan saya menggunakannya sepanjang waktu.

Saya tidak yakin apa alasan Microsoft untuk tidak menyertakan sys.functions yang setara di SQL Server 2005 (atau SQL Server 2008, sejauh yang saya tahu), tetapi cukup mudah untuk menggulung sendiri:

CREATE VIEW my_sys_functions_equivalent
AS
SELECT *
FROM sys.objects
WHERE type IN ('FN', 'IF', 'TF')  -- scalar, inline table-valued, table-valued
LukeH
sumber
7
Ini juga harus mencakup jenis fungsi CLR: 'AF', 'FS', dan 'FT'. Lihat deskripsi kolom "type" sys.objects di sini: msdn.microsoft.com/en-us/library/ms190324.aspx
Triynko
4
"AF" tidak dianggap sebagai "fungsi" dalam hal metadata objek SQL Server meskipun itu singkatan dari AGGREGATE_FUNCTION. Lebih jelas lagi bahwa Agregat adalah jenis objek yang berbeda dari fungsi yang ditentukan pengguna lainnya saat mempertimbangkan bahwa Anda membuat agregat baru menggunakan CREATE AGGREGATE daripada CREATE FUNCTION. Jenis objek 'FN', 'IF', 'TF', 'FS' dan 'FT' adalah lima jenis fungsi yang dihasilkan oleh SSMS (melalui SMO) saat membuat skrip JIKA ADA ... DROP FUNCTION kode.
Orlando Colamatteo
37

Cara lain untuk membuat daftar fungsi adalah dengan menggunakan tampilan INFORMATION_SCHEMA.

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

Menurut situs web Microsoft "Tampilan skema informasi menyediakan tampilan tabel-tabel internal yang independen dari metadata SQL Server. Tampilan skema informasi memungkinkan aplikasi untuk bekerja dengan benar meskipun perubahan signifikan telah dibuat pada tabel sistem yang mendasarinya". Dengan kata lain, tabel Sistem yang mendasari dapat berubah saat SQL dimutakhirkan, tetapi tampilan harus tetap sama.

Tim C
sumber
Ya, terima kasih, saya juga tahu INFORMATION_SCHEMA - tetapi sebagai pengguna lama, sys.xxxx masih lebih mudah - terima kasih atas pengingatnya!
marc_s
4
INFORMATION_SCHEMA akan bagus, tetapi tidak mencakup keseluruhan prosedur yang lebih besar - yang membuatnya kurang berharga jika Anda mencari di dalam tubuh. Bukan apa yang Anda tidak tahu yang akan membuat Anda dalam masalah, tetapi apa yang Anda ketahui itu tidak begitu ...
jmoreno
3
Tampilan Information_Schema secara jelas didokumentasikan sebagai tidak dapat diandalkan untuk beberapa hal. misalnya "Jangan gunakan tampilan INFORMATION_SCHEMA untuk menentukan skema objek. Satu-satunya cara yang dapat diandalkan untuk menemukan skema objek adalah dengan menanyakan tampilan katalog sys.objects." dari msdn.microsoft.com/en-us/library/ ms188757.aspx
David Eison
Saya suka jawaban ini, karena INFORMATION_SCHEMAkueri mengembalikan hasil yang sangat menarik seperti IS_DETERMINISTIC(yang ingin saya ketahui).
Tomasz Gandor
18

Ini berlaku di 2008 R2 sesuai yang dihasilkan SSMS saat Anda membuat skrip DROP suatu fungsi:

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
*/
Orlando Colamatteo
sumber
1
Saran pengeditan Anda harus berupa komentar, bukan pengeditan. "AF Aggregate function" jelas dari dokumentasi MS (periksa tautannya), jadi posting ini terlihat sepenuhnya benar. Jika Anda tidak setuju: beri komentar . Tidak mengedit. Jika orang berulang kali menolak suntingan Anda, ini seharusnya menjadi petunjuk bahwa Anda mungkin melakukan sesuatu yang salah, dan bukan orang lain.
Martin Tournoij
@Carpetsmoker "AF" tidak dianggap sebagai "fungsi" dalam istilah metadata objek SQL Server meskipun itu singkatan dari AGGREGATE_FUNCTION. Lebih jelas lagi bahwa Agregat adalah jenis objek yang berbeda dari fungsi yang ditentukan pengguna lainnya saat mempertimbangkan bahwa Anda membuat agregat baru menggunakan CREATE AGGREGATE daripada CREATE FUNCTION. Jenis objek 'FN', 'IF', 'TF', 'FS' dan 'FT' adalah lima jenis fungsi yang dihasilkan oleh SSMS (melalui SMO) saat membuat skrip JIKA ADA ... DROP FUNCTION kode. Anda harus menerima suntingan saya untuk mengembalikan penambahan AF yang salah ke daftar jenis fungsi SQL Server.
Orlando Colamatteo
5

Ini sedikit lebih bertele-tele, tetapi ini seharusnya melakukan hal yang persis sama:

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

Sejauh yang saya bisa lihat, ini juga tidak ada di SQL Server 2008.

Ayresome
sumber
1
Ya, itulah yang pada dasarnya saya lakukan sendiri untuk membuat tampilan "sys_functions" :-) Hanya bertanya-tanya mengapa tidak ada dalam produk di luar kotak ....
marc_s
4

Ini tidak menambahkan sesuatu yang baru, tetapi saya menemukan yang berikut ini lebih mudah diingat:

select * from sys.objects where type_desc like '%fun%'
yoniLavi
sumber
Jika Anda memposting kode, XML, atau sampel data, harap sorot baris tersebut di editor teks dan klik tombol "sampel kode" ( { }) pada bilah alat editor untuk memformat dan menyorotnya dengan baik!
marc_s
Terima kasih, tapi saya berusaha menghindari "memiliki segalanya" sys.objectssebisa saya.
marc_s
4

coba ini :

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

kebetulan, tidakkah Anda ingin memasukkan type = 'FS'?

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

itulah yang sesuai dengan item di sys.objects untuk UDF saya yang berasal dari DLL eksternal


sumber
2

Untuk memperluas jawaban @ LukeH, untuk mengembalikan definisi fungsi juga membutuhkan penggabungan ke sys.sql_modulestabel. Jadi pertanyaannya adalah:

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

di mana di atas menampilkan nama fungsi, definisi dan pengenal objeknya masing-masing.

Ksatria bulan
sumber
2

Untuk penjelasan lebih lengkap tentang fungsi skalar termasuk pemilik dan tipe pengembalian:

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';
Peter Brand
sumber
0

SQL 2000 spesifik, sedikit penyesuaian untuk nama objek:

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

ATAU

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