USP_RENAMESCHEMABOUND

Parameters

Parameter Parameter Type Mode Description
@BEFORE nvarchar(max) IN
@AFTER nvarchar(max) IN

Definition

Copy


CREATE procedure dbo.USP_RENAMESCHEMABOUND( @BEFORE nvarchar(max), @AFTER nvarchar(MAX))
as
begin

    declare @DROP nvarchar(max);
    declare @DEFINITION nvarchar(max);

    if not exists ( select name from sys.tables where name = 'SCHEMABOUNDVIEWSRENAMED'
    begin
        CREATE TABLE [dbo].[SCHEMABOUNDVIEWSRENAMED](
            NAME nvarchar(max) collate DATABASE_DEFAULT not null
            ,DROPSTMT nvarchar(max) collate DATABASE_DEFAULT not null
            ,[DEFINITION] [nvarchar](max) collate DATABASE_DEFAULT NOT NULL 
            ,DROPPED int                     
            ) ON [DEFGROUP]
    end

    insert into [SCHEMABOUNDVIEWSRENAMED] (NAME, DROPSTMT, DEFINITION, DROPPED)
        select distinct 
            s.name
            ,'drop view ' + s.name + '.' + o.name as ObjName
            , m.definition  
            ,0
        from sys.sql_dependencies d
            join sys.objects o 
                    on o.object_id=d.object_id
            join sys.objects r 
                    on r.object_id=d.referenced_major_id
            join sys.sql_modules as
                    on o.object_id = m.object_id
            join sys.schemas as s
                    on o.schema_id = s.schema_id
            left outer join SCHEMABOUNDVIEWSRENAMED AS S2
            on S2.NAME = s.NAME
        where
            d.class=1
            and r.name = @BEFORE
            and o.type = 'V'
            and s2.NAME is null
    ;

    declare CMod cursor FAST_FORWARD for select DROPSTMT, DEFINITION from [SCHEMABOUNDVIEWSRENAMED] where DROPPED = 0
    ;    

    open CMod;
    fetch next from CMod into @DROP, @DEFINITION;
    while @@FETCH_STATUS = 0
    begin

        exec (@DROP);
        fetch next from CMod into @DROP, @DEFINITION;
    end;
    close Cmod;
    deallocate CMod;

    exec sp_rename @BEFORE, @AFTER;

    update dbo.[SCHEMABOUNDVIEWSRENAMED] set DROPPED = 1 where DROPPED = 0
end