SQL Server -“ sys.functions” อยู่ที่ไหน


104

SQL Server 2005 มีsys.XXXมุมมองที่ยอดเยี่ยมเกี่ยวกับแค็ตตาล็อกระบบที่ฉันใช้บ่อย

สิ่งที่ทำให้ฉันสะดุดคือเหตุใดจึงมีsys.proceduresมุมมองเพื่อดูข้อมูลเกี่ยวกับขั้นตอนการจัดเก็บของคุณ แต่ไม่มีsys.functionsมุมมองที่จะเห็นเหมือนกันสำหรับฟังก์ชันที่จัดเก็บของคุณ

ไม่มีใครใช้ฟังก์ชั่นที่เก็บไว้? ฉันคิดว่ามันมีประโยชน์มากสำหรับเช่นคอลัมน์จากการคำนวณและอื่น ๆ !

มีเหตุผลที่เฉพาะเจาะจงsys.functionsขาดหายไปหรือเป็นเพียงสิ่งที่ถือว่าไม่สำคัญพอที่จะใส่ลงในsysมุมมองแค็ตตาล็อก? มีใน SQL Server 2008 หรือไม่

ไชโยมาร์ค


คำตอบที่ให้ไว้โดย TimC (ตอบเมื่อ 22 มกราคมเวลา 14:06 น.) เป็นที่ต้องการมากกว่าการใช้ตารางระบบ sysobjects ที่เก่ากว่าเนื่องจากคุณมีคอลัมน์ LAST_ALTERED ใน INFORMATION_SCHEMA.ROUTINES ที่คล้ายกับคอลัมน์ modified_date ที่มีอยู่ใน sys.tables sys.views, sys.procedures เป็นต้นอย่างไรก็ตามหากคุณกำลังใช้มุมมองระบบ sys.objects ที่อัปเดตเพิ่มเติมคุณจะมี modified_date ในตารางเหล่านั้น 0.02 เหรียญของฉัน ไชโย
ชู

1
@JuniorMayhe: ตกลง - นี่คือข้อเสนอแนะ Connectที่ฉันป้อน - เพิ่มคะแนน! :-)
marc_s

1
ผมคิดว่า @marc_s มีจุดดี: sys.functionsหลายคนไม่สามารถเข้าใจว่าทำไมไม่มี คุณมีและไม่มีการsys.foreign_keys sys.primary_keysอย่างไรก็ตามฉันขอให้พวกคุณใช้ช่องทางเปิดของ Microsoft เพื่อเสนอและแนะนำคุณสมบัติใหม่สำหรับการอัปเกรดของ SQL Server ที่connect.microsoft.com/SQLServer/Feedbackฉันได้เพิ่มคำติชมเกี่ยวกับ sys.functions แล้วที่connect.microsoft.com/ SQLServer / feedback / details / 1127920
Junior Mayhé

คำตอบ:


116

ฉันพบว่า UDF มีประโยชน์มากและฉันก็ใช้มันตลอดเวลา

ฉันไม่แน่ใจว่าเหตุผลของ Microsoft คืออะไรที่ไม่รวมฟังก์ชัน sys.functions ที่เทียบเท่าใน SQL Server 2005 (หรือ SQL Server 2008 เท่าที่ฉันสามารถบอกได้) แต่มันง่ายพอที่จะม้วนของคุณเอง:

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

7
นอกจากนี้ยังควรรวมถึงประเภทฟังก์ชัน CLR: 'AF', 'FS' และ 'FT' ดูคำอธิบายคอลัมน์ sys.objects "type" ที่นี่: msdn.microsoft.com/en-us/library/ms190324.aspx
Triynko

4
"AF" ไม่ถือว่าเป็น "ฟังก์ชัน" ในแง่ของข้อมูลเมตาของวัตถุของ SQL Server แม้ว่าจะย่อมาจาก AGGREGATE_FUNCTION ก็ตาม เป็นที่ชัดเจนยิ่งขึ้นว่า Aggregate เป็นประเภทออบเจ็กต์ที่แตกต่างจากฟังก์ชันที่ผู้ใช้กำหนดอื่น ๆ เมื่อพิจารณาว่าคุณสร้างการรวมใหม่โดยใช้ CREATE AGGREGATE แทน CREATE FUNCTION ประเภทออบเจ็กต์ 'FN', 'IF', 'TF', 'FS' และ 'FT' คือฟังก์ชันห้าประเภทตาม SSMS (ผ่าน SMO) ที่สร้างขึ้นเมื่อเขียนสคริปต์ IF EXISTS ... DROP FUNCTION code
Orlando Colamatteo

37

อีกวิธีหนึ่งในการแสดงรายการฟังก์ชันคือการใช้มุมมอง INFORMATION_SCHEMA

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

ตามที่เว็บไซต์ Microsoft "มุมมองสคีมาข้อมูลให้มุมมองภายในระบบที่ไม่ขึ้นกับตารางของข้อมูลเมตาของ SQL Server มุมมองสคีมาข้อมูลช่วยให้แอปพลิเคชันทำงานได้อย่างถูกต้องแม้ว่าจะมีการเปลี่ยนแปลงที่สำคัญกับตารางระบบที่สำคัญ" กล่าวอีกนัยหนึ่งตารางระบบพื้นฐานอาจเปลี่ยนแปลงเมื่อ SQL ได้รับการอัปเกรด แต่มุมมองควรยังคงเหมือนเดิม


ใช่ขอบคุณฉันรู้ว่า INFORMATION_SCHEMA เช่นกัน - แต่ในฐานะผู้ใช้มานาน sys.xxxx ก็ยังง่ายกว่า - ขอบคุณสำหรับการแจ้งเตือน!
marc_s

4
INFORMATION_SCHEMA จะดีมาก แต่ไม่รวมถึงตัวเต็มของขั้นตอนที่ใหญ่กว่าซึ่งทำให้น้อยกว่าไร้ค่าหากคุณกำลังค้นหาในร่างกาย ไม่ใช่สิ่งที่คุณไม่รู้ว่าจะทำให้คุณเดือดร้อน แต่สิ่งที่คุณรู้ว่ามันไม่ใช่ ...
jmoreno

3
มุมมอง Information_Schema ได้รับการบันทึกไว้อย่างชัดเจนว่าไม่น่าเชื่อถือสำหรับบางสิ่ง เช่น "อย่าใช้มุมมอง INFORMATION_SCHEMA เพื่อกำหนดสคีมาของวัตถุวิธีเดียวที่เชื่อถือได้ในการค้นหาสคีมาของวัตถุคือการสอบถามมุมมองแค็ตตาล็อก sys.objects" จากmsdn.microsoft.com/en-us/library/ ms188757.aspx
David Eison

ฉันชอบคำตอบนี้เพราะINFORMATION_SCHEMAข้อความค้นหาให้ผลลัพธ์ที่น่าสนใจมากเช่นIS_DETERMINISTIC(ซึ่งฉันต้องการค้นหา)
Tomasz Gandor

18

สิ่งนี้ใช้ได้ใน 2008 R2 ตามสิ่งที่ SSMS สร้างขึ้นเมื่อคุณเขียนสคริปต์ DROP ของฟังก์ชัน:

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
คำแนะนำในการแก้ไขของคุณควรเป็นความคิดเห็นไม่ใช่การแก้ไข "ฟังก์ชัน AF Aggregate" ชัดเจนจากเอกสาร MS (ตรวจสอบลิงก์) ดังนั้นโพสต์นี้จึงดูถูกต้องทั้งหมด หากคุณไม่เห็น: แสดงความคิดเห็น ไม่แก้ไข หากมีคนปฏิเสธการแก้ไขของคุณซ้ำ ๆ สิ่งนี้ควรเป็นคำใบ้ว่าคุณอาจทำอะไรผิดพลาดไม่ใช่คนอื่น
Martin Tournoij

@Carpetsmoker "AF" ไม่ถือว่าเป็น "ฟังก์ชัน" ในแง่ของข้อมูลเมตาของวัตถุของ SQL Server แม้ว่าจะย่อมาจาก AGGREGATE_FUNCTION เป็นที่ชัดเจนยิ่งขึ้นว่า Aggregate เป็นประเภทออบเจ็กต์ที่แตกต่างจากฟังก์ชันที่ผู้ใช้กำหนดอื่น ๆ เมื่อพิจารณาว่าคุณสร้างการรวมใหม่โดยใช้ CREATE AGGREGATE แทน CREATE FUNCTION ประเภทออบเจ็กต์ 'FN', 'IF', 'TF', 'FS' และ 'FT' คือฟังก์ชันห้าประเภทตาม SSMS (ผ่าน SMO) ที่สร้างขึ้นเมื่อเขียนสคริปต์ IF EXISTS ... DROP FUNCTION code คุณควรยอมรับการแก้ไขของฉันเพื่อเปลี่ยนการเพิ่ม AF ที่ไม่ถูกต้องไปยังรายการประเภทฟังก์ชัน SQL Server
Orlando Colamatteo

5

มันละเอียดกว่าเล็กน้อยมาก แต่สิ่งนี้ควรทำในสิ่งเดียวกัน:

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

เท่าที่ฉันเห็นมันไม่ได้อยู่ใน SQL Server 2008 เช่นกัน


1
ใช่นั่นคือสิ่งที่ฉันทำเองโดยพื้นฐานเพื่อสร้างมุมมอง "sys_functions" :-) แค่สงสัยว่าทำไมมันไม่อยู่ในผลิตภัณฑ์จากกล่อง ....
marc_s

4

สิ่งนี้ไม่ได้เพิ่มอะไรใหม่ แต่ฉันพบว่าสิ่งต่อไปนี้จำง่ายกว่า:

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

หากคุณโพสต์โค้ด XML หรือตัวอย่างข้อมูลโปรดเน้นบรรทัดเหล่านั้นในโปรแกรมแก้ไขข้อความและคลิกที่ปุ่ม "ตัวอย่างโค้ด" ( { }) บนแถบเครื่องมือแก้ไขเพื่อจัดรูปแบบและไวยากรณ์ให้สวยงาม
marc_s

ขอบคุณ แต่ฉันพยายามหลีกเลี่ยง "มีทุกอย่าง" sys.objectsให้มากที่สุดเท่าที่จะทำได้
marc_s


2

บังเอิญคุณไม่ต้องการรวม type = 'FS' หรือไม่?

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

นั่นคือสิ่งที่รายการใน sys.objects สอดคล้องกับ UDF ของฉันซึ่งได้มาจาก DLL ภายนอก


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

โดยที่ด้านบนจะแสดงชื่อฟังก์ชันนิยามและตัวระบุอ็อบเจ็กต์ตามลำดับ


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')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.