mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2025-08-14 10:02:10 +08:00
MSSQL stored routine editor:
* Extend TAdoDBConnection.GetCreateCode for stored routines * Extract the relevant routine code in TDBConnection.ParseRoutineStructure * Match database name against ROUTINES.ROUTINE_CATALOG (not ROUTINE_SCHEMA). See http://www.heidisql.com/forum.php?t=12435 .
This commit is contained in:
@ -1871,8 +1871,27 @@ begin
|
|||||||
Result := GetVar('SELECT VIEW_DEFINITION'+
|
Result := GetVar('SELECT VIEW_DEFINITION'+
|
||||||
' FROM INFORMATION_SCHEMA.VIEWS'+
|
' FROM INFORMATION_SCHEMA.VIEWS'+
|
||||||
' WHERE TABLE_NAME='+EscapeString(Name)+
|
' WHERE TABLE_NAME='+EscapeString(Name)+
|
||||||
' AND TABLE_CATALOG='+EscapeString(Database));
|
' AND TABLE_CATALOG='+EscapeString(Database)
|
||||||
end;
|
);
|
||||||
|
end;
|
||||||
|
|
||||||
|
lntFunction: begin
|
||||||
|
Result := GetVar('SELECT ROUTINE_DEFINITION'+
|
||||||
|
' FROM INFORMATION_SCHEMA.ROUTINES'+
|
||||||
|
' WHERE ROUTINE_NAME='+EscapeString(Name)+
|
||||||
|
' AND ROUTINE_TYPE='+EscapeString('FUNCTION')+
|
||||||
|
' AND ROUTINE_CATALOG='+EscapeString(Database)
|
||||||
|
);
|
||||||
|
end;
|
||||||
|
|
||||||
|
lntProcedure: begin
|
||||||
|
Result := GetVar('SELECT ROUTINE_DEFINITION'+
|
||||||
|
' FROM INFORMATION_SCHEMA.ROUTINES'+
|
||||||
|
' WHERE ROUTINE_NAME='+EscapeString(Name)+
|
||||||
|
' AND ROUTINE_TYPE='+EscapeString('PROCEDURE')+
|
||||||
|
' AND ROUTINE_CATALOG='+EscapeString(Database)
|
||||||
|
);
|
||||||
|
end;
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -3496,6 +3515,7 @@ begin
|
|||||||
// CREATE DEFINER=`root`@`localhost` PROCEDURE `bla2`(IN p1 INT, p2 VARCHAR(20))
|
// CREATE DEFINER=`root`@`localhost` PROCEDURE `bla2`(IN p1 INT, p2 VARCHAR(20))
|
||||||
// CREATE DEFINER=`root`@`localhost` FUNCTION `test3`(`?b` varchar(20)) RETURNS tinyint(4)
|
// CREATE DEFINER=`root`@`localhost` FUNCTION `test3`(`?b` varchar(20)) RETURNS tinyint(4)
|
||||||
// CREATE DEFINER=`root`@`localhost` PROCEDURE `test3`(IN `Param1` int(1) unsigned)
|
// CREATE DEFINER=`root`@`localhost` PROCEDURE `test3`(IN `Param1` int(1) unsigned)
|
||||||
|
// MSSQL: CREATE FUNCTION dbo.ConvertToInt(@string nvarchar(255), @maxValue int, @defValue int) RETURNS int
|
||||||
|
|
||||||
// Parse parameter list
|
// Parse parameter list
|
||||||
CreateCode := Obj.CreateCode;
|
CreateCode := Obj.CreateCode;
|
||||||
@ -3512,6 +3532,7 @@ begin
|
|||||||
if CreateCode[i] = '(' then
|
if CreateCode[i] = '(' then
|
||||||
Inc(ParenthesesCount);
|
Inc(ParenthesesCount);
|
||||||
end;
|
end;
|
||||||
|
log(lcinfo, params);
|
||||||
rx.Expression := '(^|,)\s*((IN|OUT|INOUT)\s+)?(\S+)\s+([^\s,\(]+(\([^\)]*\))?[^,]*)';
|
rx.Expression := '(^|,)\s*((IN|OUT|INOUT)\s+)?(\S+)\s+([^\s,\(]+(\([^\)]*\))?[^,]*)';
|
||||||
if rx.Exec(Params) then while true do begin
|
if rx.Exec(Params) then while true do begin
|
||||||
Param := TRoutineParam.Create;
|
Param := TRoutineParam.Create;
|
||||||
@ -3532,17 +3553,31 @@ begin
|
|||||||
// See issue #3114
|
// See issue #3114
|
||||||
// See http://www.heidisql.com/forum.php?t=12435
|
// See http://www.heidisql.com/forum.php?t=12435
|
||||||
FromIS := GetResults('SELECT * FROM information_schema.'+QuoteIdent('ROUTINES')+
|
FromIS := GetResults('SELECT * FROM information_schema.'+QuoteIdent('ROUTINES')+
|
||||||
' WHERE '+QuoteIdent('ROUTINE_SCHEMA')+'='+EscapeString(Obj.Database)+
|
' WHERE '+
|
||||||
|
' ('+QuoteIdent('ROUTINE_SCHEMA')+'='+EscapeString(Obj.Database)+
|
||||||
|
' OR '+QuoteIdent('ROUTINE_CATALOG')+'='+EscapeString(Obj.Database)+')'+
|
||||||
' AND '+QuoteIdent('ROUTINE_NAME')+'='+EscapeString(Obj.Name)+
|
' AND '+QuoteIdent('ROUTINE_NAME')+'='+EscapeString(Obj.Name)+
|
||||||
' AND '+QuoteIdent('ROUTINE_TYPE')+'='+EscapeString(UpperCase(Obj.ObjType))
|
' AND '+QuoteIdent('ROUTINE_TYPE')+'='+EscapeString(UpperCase(Obj.ObjType))
|
||||||
);
|
);
|
||||||
Obj.Body := FromIS.Col('ROUTINE_DEFINITION');
|
Obj.Body := FromIS.Col('ROUTINE_DEFINITION');
|
||||||
Obj.Definer := FromIS.Col('DEFINER', True);
|
Obj.Definer := FromIS.Col('DEFINER', True);
|
||||||
Obj.Returns := FromIS.Col('DTD_IDENTIFIER', True);
|
Obj.Returns := FromIS.Col('DATA_TYPE', True);
|
||||||
|
if FromIS.Col('CHARACTER_MAXIMUM_LENGTH', True) <> '' then
|
||||||
|
Obj.Returns := Obj.Returns + '(' + FromIS.Col('CHARACTER_MAXIMUM_LENGTH', True) + ')';
|
||||||
Obj.Deterministic := FromIS.Col('IS_DETERMINISTIC', True) = 'YES';
|
Obj.Deterministic := FromIS.Col('IS_DETERMINISTIC', True) = 'YES';
|
||||||
Obj.DataAccess := FromIS.Col('SQL_DATA_ACCESS', True);
|
Obj.DataAccess := FromIS.Col('SQL_DATA_ACCESS', True);
|
||||||
Obj.Security := FromIS.Col('SECURITY_TYPE', True);
|
Obj.Security := FromIS.Col('SECURITY_TYPE', True);
|
||||||
Obj.Comment := FromIS.Col('ROUTINE_COMMENT', True);
|
Obj.Comment := FromIS.Col('ROUTINE_COMMENT', True);
|
||||||
|
if Self.Parameters.NetTypeGroup = ngMSSQL then begin
|
||||||
|
// MSSQL includes the CREATE ... clause in the definition
|
||||||
|
rx := TRegExpr.Create;
|
||||||
|
rx.ModifierI := True;
|
||||||
|
rx.ModifierG := True;
|
||||||
|
rx.Expression := '\s+AS\s+BEGIN\s+(.*)\sEND\s*$';
|
||||||
|
if rx.Exec(CreateCode) then
|
||||||
|
Obj.Body := rx.Match[1];
|
||||||
|
rx.Free;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user