-- =============================================
-- Author: Cordeyo
-- Create date: 4-22-09 11:55 AM
-- Description:
-- =============================================
ALTER PROCEDURE [dbo].[sp_CHANGE_PROCEDURE_TEXT]
@PROCEDURE VARCHAR(50), @OLDTEXT VARCHAR(50), @NEWTEXT VARCHAR(50)
WITH
EXECUTE AS CALLER
AS
BEGIN
SET NOCOUNT ON;
DECLARE @PROCEDURETEXT VARCHAR(8000);
DECLARE @NEWPROCEDURE VARCHAR(8000);
-- To build new text
DECLARE @PROCEDURELENGTH BIGINT; -- size of the procedure text
DECLARE @LEFTSTRING VARCHAR(8000); -- left side before @OLDTEXT
DECLARE @RIGHTSTRING VARCHAR(8000); -- right side after @OLDTEXT
DECLARE @SEARCHLENGTH INT; -- length of the text to search for
DECLARE @STARTPOSITION INT; -- where search string starts
DECLARE @ENDPOSITION INT; -- where search string ends
SET @STARTPOSITION = (SELECT PATINDEX('%'+@OLDTEXT+'%', TEXT)
FROM SYSCOMMENTS C, SYSOBJECTS O
WHERE (O.ID = C.ID) AND (xtype = 'P') AND (NAME = @PROCEDURE))
IF (@STARTPOSITION = 0)
BEGIN
PRINT @OLDTEXT + ' NOT FOUND!'
RETURN
END
ELSE
-- Get all stored procedure text into variable
SET @PROCEDURETEXT = (SELECT TEXT
FROM SYSCOMMENTS C, SYSOBJECTS O
WHERE (O.ID = C.ID) AND (xtype = 'P') AND (NAME = @PROCEDURE))
-- May need to change CREATE PROCEDURE to ALTER PROCEDURE
SET @STARTPOSITION = PATINDEX('%CREATE PROCEDURE%', @PROCEDURETEXT)
SET @PROCEDURELENGTH = LEN(@PROCEDURETEXT)
IF @STARTPOSITION > 0
BEGIN -- build new text which replaces CREATE with ALTER
SET @SEARCHLENGTH = 16
SET @ENDPOSITION = @STARTPOSITION + @SEARCHLENGTH
SET @PROCEDURETEXT = 'ALTER PROCEDURE' + RIGHT(@PROCEDURETEXT, @PROCEDURELENGTH - (@ENDPOSITION - 1))
END
-- Prep for user requested change
SET @STARTPOSITION = PATINDEX('%'+@OLDTEXT+'%', @PROCEDURETEXT)
SET @PROCEDURELENGTH = LEN(@PROCEDURETEXT)
-- Loop until all occurences are changed
WHILE @STARTPOSITION > 0
BEGIN
-- Now build new text which replaces user parameter
IF (@STARTPOSITION > 0)
BEGIN
IF @STARTPOSITION > 0
BEGIN
SET @SEARCHLENGTH = LEN(@OLDTEXT)
SET @ENDPOSITION = @STARTPOSITION + @SEARCHLENGTH
SET @LEFTSTRING = LEFT(@PROCEDURETEXT, (@STARTPOSITION - 1))
SET @RIGHTSTRING = RIGHT(@PROCEDURETEXT, @PROCEDURELENGTH - (@SEARCHLENGTH + (@STARTPOSITION - 1)))
-- The new procedure text
SET @PROCEDURETEXT = @LEFTSTRING + @NEWTEXT + @RIGHTSTRING
-- Is there another change needed
SET @STARTPOSITION = PATINDEX('%'+@OLDTEXT+'%', @PROCEDURETEXT)
SET @PROCEDURELENGTH = LEN(@PROCEDURETEXT)
END
END
END
EXEC (@PROCEDURETEXT)
END