SQL Server - “sys.functions” ở đâu?


104

SQL Server 2005 có chế độ xem sys.XXX tuyệt vời trên danh mục hệ thống mà tôi thường xuyên sử dụng.

Điều khiến tôi khó xử là: tại sao có chế độ xem "sys.procedures" để xem thông tin về các thủ tục được lưu trữ của bạn, nhưng không có chế độ xem "sys.functions" để xem các chức năng đã lưu của bạn?

Không ai sử dụng các chức năng được lưu trữ? Tôi thấy chúng rất tiện dụng cho các cột được tính toán và như vậy!

Có lý do cụ thể nào mà sys.functions bị thiếu, hay nó chỉ là thứ không được coi là đủ quan trọng để đưa vào chế độ xem danh mục sys ?? Nó có sẵn trong SQL Server 2008 không ??

Chúc mừng, Marc


Câu trả lời do TimC cung cấp (trả lời vào ngày 22 tháng 1 lúc 14:06) được ưu tiên hơn so với việc sử dụng bảng hệ thống sysobjects cũ hơn, vì bạn đã có một cột LAST_ALTERED trong INFORMATION_SCHEMA.ROUTINES tương tự như cột mod_date tồn tại trong sys.tables, sys.views, sys.procedures, v.v. Tuy nhiên, nếu bạn đang sử dụng chế độ xem hệ thống sys.objects được cập nhật nhiều hơn, thì bạn có mod_date như trong các bảng đó. 0,02 đô la của tôi. Chúc mừng,
-Matthew

1
@JuniorMayhe: ok - đây là phản hồi đề xuất Connect mà tôi đã nhập - hãy ủng hộ nó! :-)
marc_s

1
Tôi nghĩ @marc_s có một điểm tốt: nhiều người không thể hiểu tại sao không có sys.functions. Bạn có sys.foreign_keysvà không sys.primary_keys. Dù sao, tôi yêu cầu các bạn sử dụng kênh mở của Microsoft để đề xuất và đề xuất các tính năng mới cho các phiên bản cập nhật của SQL Server tại connect.microsoft.com/SQLServer/Feedback Tôi đã thêm phản hồi về sys.functions tại connect.microsoft.com/ SQLServer / feedback / details / 1127920
Junior Mayhé

Câu trả lời:


117

Tôi thấy UDF rất tiện dụng và tôi sử dụng chúng mọi lúc.

Tôi không chắc lý do của Microsoft là gì khi không bao gồm sys.functions tương đương trong SQL Server 2005 (hoặc SQL Server 2008, theo như tôi có thể nói), nhưng bạn có thể dễ dàng thực hiện:

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

7
Điều này cũng phải bao gồm các loại chức năng CLR: 'AF', 'FS' và 'FT'. Xem mô tả cột "loại" của sys.objects tại đây: msdn.microsoft.com/en-us/library/ms190324.aspx
Triynko

4
"AF" không được coi là một "chức năng" xét về siêu dữ liệu đối tượng của SQL Server mặc dù nó là viết tắt của AGGREGATE_FUNCTION. Rõ ràng hơn rằng Aggregate là một kiểu đối tượng khác với các hàm khác do người dùng định nghĩa khi xem xét rằng bạn tạo một tổng hợp mới bằng cách sử dụng CREATE AGGREGATE thay vì CREATE FUNCTION. Các loại đối tượng 'FN', 'IF', 'TF', 'FS' và 'FT' là năm loại chức năng theo những gì SSMS (thông qua SMO) tạo ra khi viết mã lệnh NẾU TỒN TẠI ... DROP FUNCTION.
Orlando Colamatteo 21/12/12

37

Một cách khác để liệt kê các hàm là sử dụng dạng xem INFORMATION_SCHEMA.

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

Theo trang web của Microsoft "Chế độ xem lược đồ thông tin cung cấp chế độ xem nội bộ, độc lập với bảng hệ thống của siêu dữ liệu SQL Server. Chế độ xem lược đồ thông tin cho phép các ứng dụng hoạt động chính xác mặc dù đã có những thay đổi đáng kể đối với bảng hệ thống cơ bản". Nói cách khác, các bảng Hệ thống cơ bản có thể thay đổi khi SQL được nâng cấp, nhưng các khung nhìn vẫn phải giữ nguyên.


Vâng, cảm ơn, tôi cũng biết INFORMATION_SCHEMA - nhưng với tư cách là người dùng lâu năm, sys.xxxx vẫn trở nên dễ dàng hơn - cảm ơn bạn đã nhắc nhở!
marc_s

4
INFORMATION_SCHEMA sẽ rất tuyệt, nhưng nó không bao gồm toàn bộ nội dung của các thủ tục lớn hơn - điều này khiến nó trở nên vô ích nếu bạn đang tìm kiếm trong nội dung. Đó không phải là những gì bạn không biết rằng sẽ giúp bạn có gặp khó khăn, nhưng những gì bạn biết rằng aint như vậy ...
jmoreno

3
Chế độ xem Information_Schema được ghi nhận rõ ràng là không đáng tin cậy đối với một số thứ. ví dụ: "Không sử dụng dạng xem INFORMATION_SCHEMA để xác định lược đồ của một đối tượng. Cách đáng tin cậy duy nhất để tìm giản đồ của một đối tượng là truy vấn chế độ xem danh mục sys.objects." từ msdn.microsoft.com/en-us/library/ ms188757.aspx
David

Tôi thích câu trả lời này, bởi vì INFORMATION_SCHEMAtruy vấn trả về các kết quả rất thú vị như IS_DETERMINISTIC(mà tôi muốn tìm hiểu).
Tomasz Gandor

18

Điều này có hiệu lực trong 2008 R2 theo những gì SSMS tạo ra khi bạn tập lệnh DROP của một hàm:

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
Đề xuất chỉnh sửa của bạn phải là một nhận xét, không phải là một chỉnh sửa. "Chức năng Tổng hợp AF" rõ ràng là từ tài liệu MS (kiểm tra liên kết), vì vậy bài đăng này trông hoàn toàn chính xác. Nếu bạn không đồng ý: bình luận . Không chỉnh sửa. Nếu mọi người liên tục từ chối chỉnh sửa của bạn, điều này có thể là một gợi ý rằng có lẽ bạn đang làm sai điều gì đó, chứ không phải người khác.
Martin Tournoij

@Carpetsmoker "AF" không được coi là một "hàm" về mặt siêu dữ liệu đối tượng của SQL Server mặc dù nó là viết tắt của AGGREGATE_FUNCTION. Rõ ràng hơn rằng Aggregate là một kiểu đối tượng khác với các hàm khác do người dùng định nghĩa khi xem xét rằng bạn tạo một tổng hợp mới bằng cách sử dụng CREATE AGGREGATE thay vì CREATE FUNCTION. Các loại đối tượng 'FN', 'IF', 'TF', 'FS' và 'FT' là năm loại chức năng theo những gì SSMS (thông qua SMO) tạo ra khi viết mã lệnh NẾU TỒN TẠI ... DROP FUNCTION. Bạn nên chấp nhận chỉnh sửa của tôi để hoàn nguyên việc bổ sung AF không chính xác vào danh sách các loại hàm SQL Server.
Orlando Colamatteo

5

Nó hơi dài dòng hơn một chút, nhưng điều này sẽ làm chính xác những điều tương tự:

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

Theo như tôi thấy, nó cũng không có trong SQL Server 2008.


1
Vâng, đó là những gì tôi về cơ bản đã làm bản thân mình để tạo ra một "sys_functions" xem :-) Chỉ cần tự hỏi tại sao nó không có trong sản phẩm ra khỏi hộp ....
marc_s

4

Điều này không thêm bất cứ điều gì mới, nhưng tôi thấy những điều sau đây dễ nhớ hơn:

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

Nếu bạn đăng các mẫu mã, XML hoặc dữ liệu, vui lòng đánh dấu các dòng đó trong trình soạn thảo văn bản và nhấp vào nút "mẫu mã" ( { }) trên thanh công cụ của trình soạn thảo để định dạng độc đáo và đánh dấu cú pháp!
marc_s

Cảm ơn, nhưng tôi cố gắng tránh "có tất cả" sys.objectsnhiều nhất có thể.
marc_s

4

thử cái này :

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

2

tình cờ, bạn sẽ không muốn bao gồm type = 'FS'?

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

đó là những gì mà mục trong sys.objects tương ứng với UDF của tôi được tạo ra từ một DLL bên ngoài


2

Để mở rộng câu trả lời của @ LukeH, để trả về các định nghĩa hàm cũng yêu cầu một phép nối vào sys.sql_modulesbảng. Vì vậy, truy vấn cho điều này là:

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

trong đó ở trên hiển thị tên hàm, định nghĩa của nó và định danh đối tượng tương ứng.


2

Để có mô tả đầy đủ hơn về các hàm vô hướng bao gồm chủ sở hữu và loại trả về:

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 điều chỉnh cụ thể, nhẹ cho tên đối tượng:

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

HOẶC LÀ

SELECT *
FROM dbo.sysobjects
WHERE type IN ('FN', 'IF', 'TF')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.