2017-01-26 3 views
2

갖는 간단한 저장 프로 시저를 다음과 같이 매개 변수 : TSQL은

CREATE PROCEDURE [dbo].[ProcedureName] 
    @p1IntMandatory INT , 
    @p2IntDefValueZero INT = 0 , 
    @p3VarcharWzValue VARCHAR(MAX) = 'abc' , 
    @p4DateTimeNullable DATETIME = NULL , 
    @p5IntOutWzValueZero INT = 0 OUTPUT 
AS 
BEGIN 

    SET NOCOUNT ON; 

END; 

특별히 저장 프로 시저 매개 변수 메타 데이터 "has_default_value", "DEFAULT_VALUE"와 "IS_NULLABLE"열을 얻기 위해이 문을 실행하는 경우 , 나는 그들의 가치가 무효하다는 것을 알았다.

name     has_default_value default_value is_nullable 
@p1IntMandatory   0     NULL   1 
@p2IntDefValueZero  0     NULL   1 
@p3VarcharWzValue  0     NULL   1 
@p4DateTimeNullable  0     NULL   1 
@p5IntOutWzValueZero 0     NULL   1 

특별히이 3 열 저장 프로 시저에 대해 유효한 메타 데이터를 얻을 수있는 권리 방법이 있나요 :

SELECT * 
FROM sys.parameters 
WHERE object_id = OBJECT_ID('[dbo].[ProcedureName]'); 

다음은 결과입니다?

+0

봐에서 ... 한 단계 더 그것을 복용 : https://msdn.microsoft.com/en-us/library/ms173796.aspx에서 [문서] (HTTPS에서 – McNets

+1

: //msdn.microsoft.com/en-us/library/ms176074.aspx) : SQL Server는이 카탈로그 뷰의 CLR 개체에 대한 기본값 만 유지합니다. 따라서 Transact-SQL 개체의 경우이 열의 값은 0입니다. Transact-SQL 개체에서 매개 변수의 기본값을 보려면 sys.sql_modules 카탈로그 뷰의 정의 열을 쿼리하거나 OBJECT_DEFINITION 시스템 함수를 사용합니다. –

+0

sys.sql_modules 또는 유사하게 정의를 구문 분석해야합니다. – scsimon

답변

0

여기 해킹이 시작됩니다. 해결책은 아니지만 의견을 제시하기에는 너무 길지만 아마 시작할 수 있습니다. 프로 시저 생성을 '있는 그대로'로 추출하려는 시도입니다.

SELECT 
    --charindex('create proc',[definition]) as SubstringStartLocation 
    --,charindex('as',substring([definition],charindex('create proc',[definition]),len([definition]))) SubStringLength 
    substring([definition],charindex('create proc',[definition]),charindex('as',substring([definition],charindex('create proc',[definition]),len([definition]))) - 1) as ProcCreation 
    ,definition as ProcDefinition 
FROM sys.sql_modules 
WHERE definition like '%create proc%' 

그럼 당신은 진짜 까다로운 얻을 수 있지만 희망이 도움이 어디에 해당 열을 구문 분석해야합니다. 여기

if object_id('tempdb..#procs') is not null drop table #procs 

SELECT 
    --charindex('create proc',[definition]) as SubstringStartLocation 
    --,charindex('as',substring([definition],charindex('create proc',[definition]),len([definition]))) SubStringLength 
    substring([definition],charindex('create proc',[definition]),charindex('as',substring([definition],charindex('create proc',[definition]),len([definition]))) - 1) as ProcCreation 
    ,definition as ProcDefinition 
into #procs 
FROM sys.sql_modules 
WHERE definition like '%create proc%' 


select 
    ProcCreation 
    ,right(rtrim(ProcCreation),len(ProcCreation) - charindex('@',ProcCreation) + 1) as Variables 
from #procs 
where ProcCreation like '%@%' 
+0

이것은 시험 버전이지만, 저장 프로 시저를 무겁게 파싱하는 대신 올바른 방법을 선호합니다. –

+0

@ MohammedOsman은 문서에 명시된 바와 같이 어디에도 저장되지 않으므로 모든 솔루션이 맞춤식이어야합니다. 나는 당신이 "적절한"것이라고 부르는 것을 모른다. – scsimon

+0

저장 프로 시저 텍스트를 구문 분석하는 방법은 무엇입니까?! 이 SP 매개 변수 (예 :)를 가져올 수 없습니다. '- ================= - 작성자 : \t \t - 작성 날짜 : 08/06/2012 - 설명 : \t - EXEC [dbo ]. [프로 시저] @ 사용자 이름 = '모하메드', @ 패스워드 = 'q + z6QksS1Qg =', @roleId = 1; - EXEC [dbo]. [프로 시저] @userName = '모하메드', @password = 'q + z6QksS1Qg =', @roleId = 2; - ======================= 작성 절차 [ . DBO] PROCEDURE2] ( @username NVARCHAR (50) NVARCHAR @Password (50), INT @roleId )는 로 SET NOCOUNT BEGIN; END' –