1

versionテーブルを使用してデータベースを特定のタイプの瞬間に移動できるプロシージャを作成する必要があります。たとえば、バージョン1からバージョン10に、またはその逆に移動します。問題は、私がこの章でかなりぼやけているということです、そして学校のコースはそれについてほとんど何もありません。インターネットを使ってソリューションを構築しようとしましたが、どういうわけか行き詰まりました。私が間違っていることを理解するのを手伝ってください。

テーブルバージョン、1列、タイプint

クエリ

 create procedure [dbo].[goto_vs] (
        @vs int
    )
    as
    begin
        declare @current_vs int, @counter int;
        declare @sqlquery nvarchar(50); --query to modify
        declare @sqlsp nvarchar(30);
        declare @sqlversion nvarchar(3);
        declare @sqlreverse nvarchar(10);

        --get the current version from table
        select @current_vs=version from dbo.version;

        --checking for valid version
        if (@current_vs = @vs) begin
            print('The database is already at this version...')
            return
        end
        else begin
            if (@vs > 5) begin
                print('Setting the version of databse to last one...')
                set @vs = 5
            end
            else begin
                if (@vs < 0) begin
                    print('Setting the database to default...')
                    set @vs = 0
                end
            end
        end

        --setting up the string for exec
        set @sqlsp = 'exec sp_create_table_awards'

        --check if we go further or earlier in time
        print('Changing database version...')
        if (@vs > @current_vs) begin
            set @sqlreverse = ''
            goto upgrading
        end
        else begin
            set @sqlreverse = 'undo_create_awards'
            goto downgrading
        end

        --upgrading code
        upgrading:
            set @counter = @current_vs + 1
            while (@counter <= @vs) begin
                set @sqlquery = @sqlsp + cast(@counter as nvarchar(2)) + @sqlreverse
                print(@sqlquery)
                exec sp_executeSql @sqlquery
                set @counter = @counter + 1
            end
            goto ending
        downgrading:
            set @counter = @current_vs
            while (@counter > @vs) begin
                set @sqlquery = @sqlsp + cast(@counter as nvarchar(2)) + @sqlreverse
                print(@sqlquery)
                exec sp_executeSql @sqlquery
                set @counter = @counter - 1
            end
            goto ending
        ending:
            update dbo.version set version=@vs
            print('Database version changed...')
    end
4

1 に答える 1

1

方法を考えて回答がないことを考慮して、コンピュータサイエンスを勉強している他の学生に役立つ可能性があるため、回答として投稿します。

簡単にするために、すべてのプロシージャにこのパターンdo_xで名前を付けました。undo_xここxで、do / undo _xは、よりタフなペアのプロシージャです。たとえば、do_1とundo_1はテーブルを作成し、テーブルを破棄します。

ALTER PROCEDURE [dbo].[goto_vs] 
    -- Add the parameters for the stored procedure here
    @v int = 0

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    declare @i int
    declare @toexec nvarchar(70)

    set @i = (select version from version)

    -- If the requested version is lower than the current one, downgrade.
    while(@i > @v)
        BEGIN
            set @i = @i - 1
            set @toexec = 'Undo_' + CONVERT(varchar,@i);
            exec sp_executeSql @toexec
            print @toexec
        END

    -- Otherwise, upgrade.
    while(@i < @v)
        BEGIN
            set @toexec = 'Update_' + CONVERT(varchar, @i);
            exec sp_executeSql @toexec
            set @i = @i + 1
            print @toexec 
        END 
END
于 2012-11-28T15:31:33.643 に答える