SQL Server - "sys.functions" nerede?


104

SQL Server 2005, sık kullandığım sistem kataloğunda harika sys.XXX görünümlerine sahip.

Beni tökezleten şey şudur: neden depolanmış prosedürleriniz hakkında bilgi görmek için bir "sys.procedures" görünümü var, ancak depolanan işlevleriniz için aynı şeyi görmek için "sys.functions" görünümü yok?

Saklanan işlevleri kimse kullanmıyor mu? Bunları, örneğin hesaplanmış sütunlar ve benzeri için çok kullanışlı buluyorum!

Sys.functions'ın eksik olmasının belirli bir nedeni var mı, yoksa bu sadece sys katalog görünümlerine koymak için yeterince önemli görülmeyen bir şey mi? SQL Server 2008'de mevcut mu?

Şerefe, Marc


TimC tarafından sağlanan cevap (22 Ocak 14: 06'da cevaplandı) eski sysobjects sistem tablosuna tercih edilir, çünkü INFORMATION_SCHEMA.ROUTINES'te sys.tables'da bulunan modifiye_tarih sütununa benzer bir LAST_ALTERED sütununuz vardır, sys.views, sys.procedures, vb. Ancak, daha güncel sys.objects sistem görünümünü kullanıyorsanız, bu tablolarda olduğu gibi değiştir_tarihiniz vardır. 0,02 dolarım. Şerefe, -Matthew
Maashu

1
@JuniorMayhe: tamam - işte girdiğim Connect öneri geri bildirimi - yukarı oy verin! :-)
marc_s

1
Bence @marc_s iyi bir noktaya sahip: birçok insan neden olmadığını anlayamıyor sys.functions. Sen var sys.foreign_keysve hayır sys.primary_keys. Neyse, ben SQL Server sürümlerini upcomming için yeni özellikler önermek için Microsoft'un açık kanalını kullanmak sizi sorup önermek connect.microsoft.com/SQLServer/Feedback daha önce en sys.functions ilgili geribildirim eklemiş I connect.microsoft.com/ SQLServer / geribildirim / ayrıntılar / 1127920
Junior Mayhé

Yanıtlar:


117

UDF'leri çok kullanışlı buluyorum ve onları her zaman kullanıyorum.

Microsoft'un mantığının, SQL Server 2005'e (ya da söyleyebileceğim kadarıyla SQL Server 2008'e) eşdeğer bir sys.fonksiyonunu dahil etmeme mantığının ne olduğundan emin değilim, ancak kendi mantığınızı döndürmek için yeterince kolay:

CREATE VIEW my_sys_functions_equivalent
AS
SELECT *
FROM sys.objects
WHERE type IN ('FN', 'IF', 'TF')  -- scalar, inline table-valued, table-valued

7
Bu aynı zamanda CLR işlev türlerini de içermelidir: 'AF', 'FS' ve 'FT'. Burada sys.objects "type" sütun açıklamasına bakın
Triynko

4
AGGREGATE_FUNCTION yerine geçmesine rağmen "AF", SQL Server'ın nesne meta verileri açısından bir "işlev" olarak kabul edilmez. CREATE FUNCTION yerine CREATE AGGREGATE kullanarak yeni bir toplam oluşturduğunuz düşünüldüğünde, Aggregate'in diğer kullanıcı tanımlı işlevlerden farklı bir nesne türü olduğu daha açıktır. Nesne türleri 'FN', 'IF', 'TF', 'FS' ve 'FT' IF EXISTS ... DROP FUNCTION kodu komut dosyası oluştururken SSMS'nin (SMO aracılığıyla) ürettiği beş işlev türüdür.
Orlando Colamatteo

37

İşlevleri listelemenin başka bir yolu, INFORMATION_SCHEMA görünümlerinden yararlanmaktır.

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

Microsoft web sitesine göre "Bilgi şeması görünümleri, SQL Server meta verilerinin dahili, sistem tablosundan bağımsız bir görünümünü sağlar. Bilgi şeması görünümleri, temeldeki sistem tablolarında önemli değişiklikler yapılmasına rağmen uygulamaların düzgün çalışmasını sağlar". Diğer bir deyişle, temel Sistem tabloları SQL yükseltildikçe değişebilir, ancak görünümler yine de aynı kalmalıdır.


Evet, teşekkürler, INFORMATION_SCHEMA'yı da biliyorum - ama uzun süredir kullanıcı olarak, sys.xxxx hala daha kolay geliyor - hatırlatıcı için teşekkürler!
marc_s

4
INFORMATION_SCHEMA harika olurdu, ancak daha büyük prosedürlerin tamamını içermez - bu da vücutta arama yapıyorsanız onu değersiz kılar.
Başınızı belaya sokacak

3
Information_Schema görünümlerinin bazı şeyler için güvenilir olmadığı açıkça belgelenmiştir. Örneğin, msdn.microsoft.com/en-us/library/ adresinden
David Eison

Bu cevabı beğendim, çünkü INFORMATION_SCHEMAsorgu IS_DETERMINISTIC(öğrenmek istediğim gibi) gibi çok ilginç sonuçlar veriyor.
Tomasz Gandor

18

Bu, bir işlevin DROP'unu komut dosyası oluşturduğunuzda SSMS'nin ürettiği her şey için 2008 R2'de geçerlidir:

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
*/

1
Düzenleme öneriniz bir düzenleme değil, bir yorum olmalıdır. "AF Agrega işlevi" açıkça MS belgelerinden alınmıştır (bağlantıyı kontrol edin), bu nedenle bu gönderi tamamen doğru görünüyor. Kabul etmiyorsanız: yorum yapın . Not edildi. İnsanlar defalarca Düzenlemenizi karşı çıkarlarsa bu bir ipucu olmalıdır Eğer belki bir şey yanlış yapıyor ve edilir değil diğer insanlara.
Martin Tournoij

@Carpetsmoker "AF", AGGREGATE_FUNCTION anlamına gelse de SQL Server'ın nesne meta verileri açısından bir "işlev" olarak kabul edilmez. CREATE FUNCTION yerine CREATE AGGREGATE kullanarak yeni bir toplam oluşturduğunuz düşünüldüğünde, Aggregate'in diğer kullanıcı tanımlı işlevlerden farklı bir nesne türü olduğu daha açıktır. Nesne türleri 'FN', 'IF', 'TF', 'FS' ve 'FT', IF EXISTS ... DROP FUNCTION kodu komut dosyası oluştururken SSMS'nin (SMO aracılığıyla) ürettiği beş işlev türüdür. AF'nin yanlış eklenmesini SQL Server işlev türleri listesine geri döndürmek için düzenlememi kabul etmelisiniz.
Orlando Colamatteo

5

Biraz daha ayrıntılı, ancak bu tam olarak aynı şeyi yapmalı:

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

Görebildiğim kadarıyla SQL Server 2008'de de yok.


1
Evet, temelde bir "sys_functions" görünümü oluşturmak için kendime yaptığım buydu :-) Sadece neden kutunun dışında ürünün içinde olmadığını merak ediyorum ....
marc_s

4

Bu yeni bir şey eklemiyor, ancak aşağıdakileri hatırlamayı daha kolay buldum:

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

Kod, XML veya veri örnekleri gönderirseniz lütfen metin düzenleyicide bu satırları vurgulayın ve { }güzel bir şekilde biçimlendirmek ve sözdizimi vurgulamak için düzenleyici araç çubuğundaki "kod örnekleri" düğmesini ( ) tıklayın !
marc_s

Teşekkürler, ama "her şeye sahip olmaktan" elimden geldiğince kaçınmaya çalışıyorum sys.objects.
marc_s

4

bunu dene :

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

2

bu arada, type = 'FS' eklemek istemez miydiniz?

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

harici bir DLL'den türetilen UDF'm için sys.objects'teki öğenin karşılık geldiği şey budur


2

@ LukeH'nin cevabını genişletmek için, fonksiyon tanımlarını döndürmek de sys.sql_modulestabloya bir birleştirmeyi gerektirir . Yani bunun sorgusu:

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

yukarıdaki, sırasıyla işlev adını, tanımını ve nesne tanımlayıcısını görüntüler.


2

Sahip ve dönüş türü dahil olmak üzere skaler işlevlerin daha kapsamlı bir açıklaması için:

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 nesne adı için belirli, küçük ayar:

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

VEYA

SELECT *
FROM dbo.sysobjects
WHERE type IN ('FN', 'IF', 'TF')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.