1

これを尋ねる質問がたくさんあることは知っていますが、このコードが失敗する理由はわかりませんが、ストアドプロシージャを開始する「BEGIN」は意味をなさない「EXTERNAL」を期待していると言っています。

IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.Insert_ToTable'))
BEGIN
    CREATE PROCEDURE [dbo].[Insert_ToTable]
    AS
    BEGIN
        BEGIN TRANSACTION
        BEGIN TRY

            //Stored Procedure Code
        END TRY
        BEGIN CATCH
            IF @@TRANCOUNT > 0
                ROLLBACK TRANSACTION;

            DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int

            SELECT @ErrMsg = ERROR_MESSAGE(),
                   @ErrSeverity = ERROR_SEVERITY()

            RAISERROR(@ErrMsg, @ErrSeverity, 1)
        END CATCH   

        IF @@TRANCOUNT > 0
            COMMIT TRANSACTION;
    END
END
4

2 に答える 2

4

ACREATE PROCEDUREは、バッチ内の唯一のステートメントである必要があります。ステートメントCREATE PROCEDUREが前にあるため、存在しない場合は条件付きで作成できません。ifただし、条件付きで削除してから、常に作成することはできます。

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Insert_ToTable]') AND type in (N'P', N'PC'))
  drop procedure [dbo].[Insert_ToTable]
go

create procedure [dbo].[Insert_ToTable]
as
  -- code
go

grant execute on [dbo].[Insert_ToTable] to whomever
go

編集#1

外部ツールを使用しているため、次のステートメントを実行して、プロシージャが存在するかどうかをテストできます。

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Insert_ToTable]') AND type in (N'P', N'PC'))
  select 'exists' as [status]
else
  select 'missing' as [status]

[status]次に、フィールドを簡単にテストし、ステータスが欠落create procedureしている場合にのみ外部ツールからステートメントを実行できます。

于 2013-07-26T21:00:38.247 に答える
1

もう 1 つの本当に、つまり、EXEC を使用してストアド プロシージャを作成することは、本当に醜い方法です。

IF NOT EXISTS (...)
BEGIN
    EXEC('CREATE PROCEDURE [dbo].[Insert_ToTable] ...')
END

必要がない場合は使用しないでください。

于 2013-07-26T22:47:45.793 に答える