2017-01-26 15 views
2

Mit einfachen gespeicherte Prozedur wie folgt aus:Tsql Metadaten gespeicherten Prozedur Erste Parameter

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; 

Wenn diese Anweisung ausgeführt wird Meta-Daten Parameter für gespeicherte Prozeduren speziell zu bekommen „has_default_value“, „default_value“ und „IS_NULLABLE“ Spalten Ich habe festgestellt, dass ihre Werte ungültig sind. Diese

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

ist das Ergebnis:

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 

Gibt es einen richtigen Weg gültige Meta-Daten über die gespeicherte Prozedur speziell diese drei Spalten zu bekommen?

+0

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

+1

In der [Dokumentation] (https: //msdn.microsoft.com/en-us/library/ms176074.aspx): SQL Server verwaltet nur Standardwerte für CLR-Objekte in dieser Katalogsicht; Daher hat diese Spalte für Transact-SQL-Objekte den Wert 0. Um den Standardwert eines Parameters in einem Transact-SQL-Objekt anzuzeigen, fragen Sie die Definitionsspalte der sys.sql_modules-Katalogsicht ab oder verwenden Sie die Systemfunktion OBJECT_DEFINITION. –

+0

Going muss die Definition von sys.sql_modules oder etwas ähnliches zu analysieren – scsimon

Antwort

0

Hier ist ein halber Weg zu einem Hack für Sie. Es ist keine Lösung, aber zu lange, um sie zu kommentieren, aber vielleicht wirst du beginnen. Es ist ein Versuch, Ihre Prozedur-Erstellung bis zum "wie" zu extrahieren.

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

Dann müssen Sie diese Spalte analysieren, wo es wirklich knifflig werden könnte, aber hoffentlich hilft das.

Hier ist es einen Schritt weiter ...

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

Obwohl dies ein Versuch ist, aber ich bevorzuge einen richtigen Weg anstelle von schweren Parsing der gespeicherten Prozedur selbst. –

+0

@MohammedOsman wie in den Dokumenten angegeben, werden sie nirgendwo gespeichert, so dass jede Lösung benutzerdefiniert sein muss. Ich weiß allerdings nicht, was Sie "richtig" nennen. – scsimon

+0

Wie kann ich den Text der gespeicherten Prozedur analysieren ?! Diese SP-Parameter (zum Beispiel) können nicht erhalten werden. '- ================= - Autor: \t \t erstellen - Datum: 08.06.2012 - Beschreibung: \t - EXEC [dbo ]. [PROCEDURE] @userName = 'Mohammed', @password = 'q + z6QksS1Qg =', @roleId = 1; - EXEC [dbo]. [VORGEHENSWEISE] @userName = 'Mohammed', @password = 'q + z6QksS1Qg =', @roleId = 2; - ========================================= CREATE PROCEDURE [ . DBO] [Prozedur2] ( @UserName NVARCHAR (50), @password NVARCHAR (50), @roleId INT ) AS BEGIN NOCOUNT ON SET; END' –

Verwandte Themen