SQL Server- "sys.functions"는 어디에 있습니까?


104

SQL Server 2005에는 자주 사용하는 시스템 카탈로그에 대한 훌륭한 sys.XXX 뷰가 있습니다.

나를 비틀 거리게하는 것은 이것이다 : 왜 저장 프로 시저에 대한 정보를 볼 수있는 "sys.procedures"뷰가 있지만 저장 함수에 대해 동일한 내용을 볼 수있는 "sys.functions"뷰가없는 이유는 무엇입니까?

아무도 저장된 기능을 사용하지 않습니까? 예를 들어 계산 된 열 등에 매우 편리합니다!

sys.functions가 누락 된 특정 이유가 있습니까, 아니면 sys 카탈로그 뷰에 넣을만큼 중요하지 않은 것으로 간주 된 것입니까 ?? SQL Server 2008에서 사용할 수 있습니까 ??

건배, 마크


sys.tables에있는 modify_date 열과 유사한 INFORMATION_SCHEMA.ROUTINES에 LAST_ALTERED 열이 있기 때문에 TimC에서 제공 한 대답 (14:06에 1 월 22 일 응답)은 이전 sysobjects 시스템 테이블을 사용하는 것보다 선호됩니다. sys.views, sys.procedures 등. 그러나 더 업데이트 된 sys.objects 시스템 뷰를 사용하는 경우 해당 테이블에서와 같이 modify_date가 있습니다. 내 $ 0.02. 건배, -Matthew
Maashu 2009

1
@JuniorMayhe : 좋아요- 제가 입력 한 Connect 제안 피드백 입니다. :-)
marc_s 2015-02-13

1
나는 @marc_s가 좋은 점을 가지고 있다고 생각합니다. 많은 사람들이 sys.functions. 당신이하지 sys.foreign_keys않고 sys.primary_keys. 어쨌든, 난에서 SQL Server 버전을 upcomming 새로운 기능을 제안하는 마이크로 소프트의 오픈 채널을 사용하는 너희들을 요청하고 제안 connect.microsoft.com/SQLServer/Feedback 이미에서 sys.functions에 관한 의견을 추가 한 I connect.microsoft.com/을 SQLServer / feedback / details / 1127920
Junior Mayhé 2015

답변:


117

저는 UDF가 매우 편리하다는 것을 알고 항상 사용합니다.

SQL Server 2005 (또는 SQL Server 2008, 내가 말할 수있는 한)에 해당하는 sys.functions를 포함하지 않은 Microsoft의 이론적 근거는 확실하지 않지만 직접 롤링하는 것은 쉽습니다.

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"는 AGGREGATE_FUNCTION을 나타내지 만 SQL Server의 개체 메타 데이터 측면에서 "함수"로 간주되지 않습니다. CREATE FUNCTION 대신 CREATE AGGREGATE를 사용하여 새 집계를 만드는 것을 고려할 때 Aggregate는 다른 사용자 정의 함수와 다른 개체 유형이라는 것이 더 분명합니다. 개체 유형 'FN', 'IF', 'TF', 'FS'및 'FT'는 IF EXISTS ... DROP FUNCTION 코드를 스크립팅 할 때 SSMS (SMO를 통해)가 생성하는 항목 당 5 가지 함수 유형입니다.
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 카탈로그 뷰를 쿼리하는 것입니다."from msdn.microsoft.com/en-us/library/ ms188757.aspx
David Eison 2012 년

INFORMATION_SCHEMA쿼리가 IS_DETERMINISTIC(내가 찾고 싶었던) 과 같은 매우 흥미로운 결과를 반환 하기 때문에이 답변 이 마음에 듭니다.
Tomasz Gandor 2015

18

이것은 함수의 DROP을 스크립팅 할 때 SSMS가 생성하는 것에 따라 2008 R2에서 유효합니다.

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"는 AGGREGATE_FUNCTION을 나타내지 만 SQL Server의 개체 메타 데이터 측면에서 "함수"로 간주되지 않습니다. CREATE FUNCTION 대신 CREATE AGGREGATE를 사용하여 새 집계를 만드는 것을 고려할 때 Aggregate는 다른 사용자 정의 함수와 다른 개체 유형이라는 것이 더 분명합니다. 개체 유형 'FN', 'IF', 'TF', 'FS'및 'FT'는 IF EXISTS ... DROP FUNCTION 코드를 스크립팅 할 때 SSMS (SMO를 통해)가 생성하는 항목 당 5 가지 함수 유형입니다. SQL Server 함수 유형 목록에 잘못된 AF 추가를 되돌리려면 내 편집을 수락해야합니다.
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

4

이 시도 :

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

2

부수적으로 type = 'FS'를 포함하고 싶지 않습니까?

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

이것이 sys.objects의 항목이 외부 DLL에서 파생 된 UDF에 해당하는 항목입니다.


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.