changing dependent Stored procedures if table schema changes

  • Hi Friends

    After a looong time.. I am back with another question.

    I have written about 25-30 stored procedures in my local db, Now I want to sync these procedures with testing DB. But I came to know this very lately that the schema of the tables used in the procedures is different from my local to testing.

    Now my question is how do I modify the procedures according to the new schema.??

    is there any tool or a way to do this quickly???.:crazy:

    or I have to do change manually each & every procedure??.


    Thanks ,

    Shekhar

  • Can you please tell clearly, what do u mean by Schema is different? is just the schema name is different or the schema objects definition is different ?

  • Shekhar this is a very common scenario...table changes are made, and procedures that are dependant on that table's schema may fail;

    I like to use this cursor *gasp* below, which i run after werun scripts against a database;

    it recompiles procs,functions and refreshes views, and reports if anything is not valid anymore, since it doesn't recompile.

    see if this works for you:

    --Identify Invalid Objects

    SET NOCOUNT ON

    DECLARE @BadObjects TABLE (ALLINVALIDOBJECTS nvarchar(4000))

    DECLARE @objname NVARCHAR(4000),

    @cmd NVARCHAR(max)

    --#################################################################################################

    --Views

    --#################################################################################################

    DECLARE acursor CURSOR FOR

    SELECT

    QUOTENAME(s.name) + '.' + QUOTENAME(v.name)

    FROM sys.views v

    INNER JOIN sys.schemas s ON v.schema_id = s.schema_id

    OPEN acursor

    FETCH NEXT FROM acursor INTO @objname

    WHILE @@FETCH_STATUS = 0

    BEGIN

    BEGIN TRANSACTION

    BEGIN TRY

    exec sp_refreshview @objname

    END TRY

    BEGIN CATCH

    ROLLBACK TRANSACTION

    INSERT @BadObjects VALUES (@objname)

    END CATCH

    FETCH NEXT FROM acursor INTO @objname

    END

    CLOSE acursor

    DEALLOCATE acursor

    --#################################################################################################

    --Procs

    --#################################################################################################

    DECLARE c1 CURSOR FOR

    SELECT

    QUOTENAME(s.name) + '.' + QUOTENAME(obs.name) ,

    mods.definition

    FROM sys.objects obs

    INNER JOIN sys.sql_modules mods ON obs.object_id = mods.object_id

    INNER JOIN sys.schemas s ON obs.schema_id = s.schema_id

    WHERE obs.is_ms_shipped = 0

    AND obs.type_desc IN('SQL_STORED_PROCEDURE')

    OPEN c1

    FETCH NEXT FROM c1 INTO @objname,@cmd

    WHILE @@fetch_status <> -1

    BEGIN

    BEGIN TRANSACTION

    BEGIN TRY

    SET @cmd = REPLACE(@cmd,convert(varchar(max),N'CREATE PROCEDURE'),convert(varchar(max),N'ALTER PROCEDURE'))

    print @cmd

    exec (@cmd)

    END TRY

    BEGIN CATCH

    ROLLBACK TRANSACTION

    INSERT @BadObjects VALUES (@objname)

    END CATCH

    FETCH NEXT FROM c1 into @objname,@cmd

    END --WHILE

    CLOSE c1

    DEALLOCATE c1

    --#################################################################################################

    --Functions

    --#################################################################################################

    DECLARE c1 CURSOR FOR

    SELECT

    QUOTENAME(s.name) + '.' + QUOTENAME(obs.name) ,

    mods.definition

    FROM sys.objects obs

    INNER JOIN sys.sql_modules mods ON obs.object_id = mods.object_id

    INNER JOIN sys.schemas s ON obs.schema_id = s.schema_id

    WHERE obs.is_ms_shipped = 0

    AND obs.type_desc IN('AGGREGATE_FUNCTION','SQL_INLINE_TABLE_VALUED_FUNCTION','SQL_TABLE_VALUED_FUNCTION','SQL_SCALAR_FUNCTION')

    OPEN c1

    FETCH NEXT FROM c1 INTO @objname,@cmd

    WHILE @@fetch_status <> -1

    BEGIN

    BEGIN TRANSACTION

    BEGIN TRY

    SET @cmd = REPLACE(@cmd,convert(varchar(max),N'CREATE FUNCTION'),convert(varchar(max),N'ALTER FUNCTION'))

    print @cmd

    exec (@cmd)

    END TRY

    BEGIN CATCH

    ROLLBACK TRANSACTION

    INSERT @BadObjects VALUES (@objname)

    END CATCH

    FETCH NEXT FROM c1 into @objname,@cmd

    END --WHILE

    CLOSE c1

    DEALLOCATE c1

    SELECT * FROM @BadObjects

    Lowell


    --help us help you! If you post a question, make sure you include a CREATE TABLE... statement and INSERT INTO... statement into that table to give the volunteers here representative data. with your description of the problem, we can provide a tested, verifiable solution to your question! asking the question the right way gets you a tested answer the fastest way possible!

Viewing 3 posts - 1 through 2 (of 2 total)

You must be logged in to reply to this topic. Login to reply