2017-01-26 1 views
2

Ayant procédure stockée simple comme ceci:Tsql Obtenir des métadonnées de paramètres procédure stockée

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; 

Lors de l'exécution de cette déclaration pour obtenir des paramètres de procédure stockée méta-données spécialement « has_default_value », « default_value » et colonnes « is_nullable » , J'ai trouvé que leurs valeurs sont invalides.

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

Ceci est le résultat:

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 

Y at-il une bonne façon d'obtenir des méta-données valides sur la procédure stockée spécialement ces 3 colonnes?

+0

Regardez: https://msdn.microsoft.com/en-us/library/ms173796.aspx – McNets

+1

Dans les ([Documentation] https: //msdn.microsoft.com/en-us/library/ms176074.aspx): SQL Server ne conserve que les valeurs par défaut pour les objets CLR dans cette vue de catalogue; par conséquent, cette colonne a la valeur 0 pour les objets Transact-SQL. Pour afficher la valeur par défaut d'un paramètre dans un objet Transact-SQL, interrogez la colonne de définition de la vue de catalogue sys.sql_modules ou utilisez la fonction système OBJECT_DEFINITION. –

+0

Aller à avoir à analyser la définition de sys.sql_modules ou quelque chose de similaire – scsimon

Répondre

0

Voici un demi-point de départ pour un hack pour vous. Ce n'est pas une solution, mais trop longue pour commenter, mais peut-être vous aidera à démarrer. C'est une tentative d'extraire la création de votre procédure jusqu'au 'comme'.

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%' 

Ensuite, vous devrez analyser sur cette colonne qui est là où il pourrait obtenir vrai difficile, mais nous espérons que cela aide.

est ici de prendre un peu plus loin ...

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

Bien que ce soit un essai, mais je préfère un moyen approprié au lieu de l'analyse lourde de la procédure stockée moi-même. –

+0

@MohammedOsman comme indiqué dans les documents, ils ne sont stockés nulle part, toute solution devra donc être personnalisée. Je ne sais pas ce que vous appelez "correct", cependant. – scsimon

+0

Comment puis-je dépendre de l'analyse du texte de la procédure stockée ?! Ces paramètres SP (par exemple) ne peuvent pas être obtenus. '- ================= - Auteur: \t \t - date de création: 08/06/2012 - Description: \t - EXEC [dbo ] [PROCEDURE] @userName = 'Mohammed', @password = 'q + z6QksS1Qg =', @roleId = 1; - EXEC [dbo]. [PROCEDURE] @userName = 'Mohammed', @password = 'q + z6QksS1Qg =', @roleId = 2; - ======================================= PROCÉDÉ DE CRÉATION [ . dbo] [Procedure2] ( @UserName NVARCHAR (50), @password NVARCHAR (50), @roleId INT) AS BEGIN SET NOCOUNT ON; END' –