0

SQLテキストファイルを実行して、SQLサーバーデータベースにストアドプロシージャを作成しようとしています。また、このメソッドを使用して、ストアドプロシージャが使用するユーザー定義のテーブルタイプを作成しています。

テーブルタイプの作成は完全に機能します。ただし、ストアドプロシージャを作成しようとすると、エラーが発生します。「CREATE / ALTER PROCEDURE」は、クエリバッチの最初のステートメントである必要があります。

ファイルを読み取り、dbに対して実行するコードは次のとおりです。

public static void LoadStoredProcedures()
    {
        const string procedureLocation = "C:\\StoredProcedures.txt";

        var reader = File.ReadAllText(procedureLocation);

        var context = new prismEntities();
        context.Database.ExecuteSqlCommand(reader);


    }

    public static void CreateTables()
    {
        const string tableLocation = "C:\\CreateTables.txt";

        var reader = File.ReadAllText(tableLocation);

        var context = new prismEntities();
        context.Database.ExecuteSqlCommand(reader);
    }

ユーザー定義テーブルの例:

if not exists (select * from sys.table_types
where name like 'TextbookTable')
create type [dbo].[TextbookTable] as table (
[TXUID] [int] NOT NULL,
[SKU] [int] NOT NULL,
[UsedSKU] [int] NOT NULL,
[BindingID] [int] NOT NULL,
[TextStatusID] [int] NOT NULL,
[StatusDate] [datetime] NULL,
[Author] [char](45) NOT NULL,
[Title] [char](80) NOT NULL,
[ISBN] [char](30) NULL,
[Imprint] [char](10) NULL,
[Edition] [char](2) NULL,
[Copyright] [char](2) NULL,
[Type] [char](10) NULL,
[Bookkey] [varchar](10) NULL,
[Weight] [decimal](10, 4) NULL,
[ImageURL] [char](128) NULL,
primary key clustered
(
    [TXUID] ASC
) with (ignore_dup_key = on)
)

私が作成しようとしているストアドプロシージャの例:

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[AddTextbook]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[AddTextbook]

create procedure [dbo].[AddTextbook]
(
@textbook TextbookTable readonly
)
as
begin
set nocount on;
set identity_insert textbook on

begin try

merge Textbook txt
using (select * from @textbook) as source
    on txt.TXUID = source.TXUID
when not matched then
    insert (TXUID, SKU, UsedSKU, BindingID, TextStatusID, StatusDate, Author,
            Title, ISBN, Imprint, Edition, Copyright, Type, Bookkey, Weight, ImageURL)
    values ( source.TXUID, source.SKU, source.UsedSKU, source.BindingID, source.TextStatusID,
             source.StatusDate, source.Author, source.Title, source.ISBN,
             source.Imprint, source.Edition,
             source.Copyright, source.Type, source.Bookkey, source.Weight, source.ImageURL);

set identity_insert textbook off    
end try

begin catch
    declare @message varchar(128) = error_message()
    select
     ERROR_NUMBER() as ErrorNumber,
     ERROR_SEVERITY() as ErrorSeverity,
     ERROR_STATE() as ErrorState,
     ERROR_PROCEDURE() as ErrorProcedure,
     ERROR_LINE() as ErrorLine,
     ERROR_MESSAGE() as ErrorMessage;
     raiserror(@message, 16, 10)
end catch
end

grant execute on [dbo].[AddTextbook] to [public]

ここで、呼び出しの順序は、CreateTablesが最初に呼び出され、次にLoadStoredProceduresが呼び出されることです。テーブルは問題なく作成されます。ストアドプロシージャは作成されず、上記のエラーが生成されます。「ifexists...」行を削除すると、ストアドプロシージャが作成されますが、同じファイルに作成しようとしている他のプロシージャがある場合、エラーが発生して作成されません。ストアドプロシージャごとに複数のファイルではなく、1つのファイルでこれを管理できるようにしたいと思います。

誰かがこれの回避策を知っていますか?うまくいけば、私は十分な情報を提供しました。前もって感謝します。

4

1 に答える 1

0

GO基本的に、コマンド間に次のような一連のステートメントがありません。

あなたは変わらなければならない

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[AddTextbook]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[AddTextbook]

create procedure [dbo].[AddTextbook]

することが

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[AddTextbook]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[AddTextbook]
GO
create procedure [dbo].[AddTextbook]
于 2013-02-04T18:26:53.140 に答える