2017-02-22 6 views
1

私は挿入を実行しているストアドプロシージャを持っています。しかし、いったんこのストアドプロシージャを実行すると、ロックはデータベースに残り、これ以上の挿入は不可能になります。実際、あなたはテーブルで選択をすることさえできません。SQL Server - データベースのロックを決定する

Management Studioでコールを実行すると、2つの選択肢が報告されているようですが、ストアドプロシージャには1つしかありません。

あなたは次のようにストアドプロシージャへの呼び出しは、ストアドプロシージャの

ソースが作るときに実際に実行されるすべてのT-SQLを示しています私が使用できる機能があるのであれば、私は疑問に思って。

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[Create_IRM_Appointment] 
    @VisitNumber varchar(50) = null, 
    @AppointmentTypeText varchar (255) = null, 
    @ClinicCode varchar(50) = null, 
    @DoctorCode varchar(50) = null, 
    @ScheduledDateTime varchar(50) = null, 
    @AppointmentStatusCode varchar(255) = null, 
    @PatientNumber varchar(200) = null, 
    @EpisodeNumber varchar(255) = null, 
    @ConsultantCode varchar(200) = null, 
    @ReferrerCode varchar(200) = null, 
    @MainSpecialtyCode varchar(100) = null, 
    @MessageType varchar (60) = null, 
    @StopDateTime varchar(50) = null, 
    @EpisodeType varchar (50) = null, 
    @EpisodeStatusCode varchar (50) = null, 
    @ParentEpisodeType varchar (50) = null, 
    @AdmissionType varchar (50) = null, 
    @AdmitDateTime varchar(50) = null, 
    @AdmitReason varchar(255) = null, 
    @AppointmentDateTime varchar(50) = null, 
    @BuildingCode varchar(50) = null, 
    @BedNumber varchar(50) = null, 
    @CategoryCode varchar(50) = null, 
    @ConsultantName varchar(255) = null, 
    @DischargeDateTime varchar(50) = null, 
    @DischargeDestination varchar(50) = null, 
    @DischargeMethod varchar(50) = null, 
    @FacilityCode varchar(50) = null, 
    @ReferralReason varchar(255) = null, 
    @ReferralAssigningAuthority varchar(50) = null, 
    @ReferrerName varchar(255) = null, 
    @TCIDate varchar(255) = null, 
    @TCILocation varchar (255) = null, 
    @WardCode varchar(50) = null 
AS 
BEGIN 
    declare @return_value int 
    declare @error_message varchar(255) 

begin try 
    insert into dbo.IRM_TEMP_Appointment 
    (
     VisitNumber, 
     WardCode, 
     ClinicCode, 
     DoctorCode , 
     ScheduledDateTime , 
     AppointmentStatusCode , 
     PatientNumber , 
     EpisodeNumber , 
     ConsultantCode , 
     ReferrerCode, 
     MainSpecialtyCode , 
     MessageType , 
     StopDateTime , 
     EpisodeType , 
     EpisodeStatusCode , 
     ParentEpisodeType , 
     AdmissionType , 
     AdmitDateTime, 
     AdmitReason, 
     AppointmentDateTime , 
     BuildingCode , 
     BedNumber, 
     CategoryCode , 
     ConsultantName , 
     DischargeDateTime , 
     DischargeDestination, 
     DischargeMethod , 
     FacilityCode , 
     ReferralReason, 
     ReferrerAssigningAuthority, 
     ReferrerName, 
     timeOfInsert, 
     timeOfAnalyse, 
     analysed, 
     currentStatus, 
     AppointmentTypeText, 
     TCIDate, 
     TCILocation) 
    values (
     @VisitNumber, 
     @WardCode, 
     @ClinicCode, 
     @DoctorCode , 
       case when @ScheduledDateTime = null then null else convert(datetime, STUFF(STUFF(STUFF(@ScheduledDateTime,9,0,' '),12,0,':'),15,0,':')) end, 
     @AppointmentStatusCode , 
     @PatientNumber , 
     @EpisodeNumber , 
     @ConsultantCode , 
     @ReferrerCode, 
     @MainSpecialtyCode , 
     @MessageType , 
       case when @StopDateTime = null then null else convert(datetime, STUFF(STUFF(STUFF(@StopDateTime,9,0,' '),12,0,':'),15,0,':')) end, 
     @EpisodeType , 
     @EpisodeStatusCode , 
     @ParentEpisodeType , 
     @AdmissionType , 
       case when @AdmitDateTime = null then null else convert(datetime, STUFF(STUFF(STUFF(@AdmitDateTime,9,0,' '),12,0,':'),15,0,':')) end, 
     @AdmitReason, 
       case when @AppointmentDateTime = null then null else convert(datetime, STUFF(STUFF(STUFF(@AppointmentDateTime,9,0,' '),12,0,':'),15,0,':')) end, 
     @BuildingCode , 
     @BedNumber, 
     @CategoryCode , 
     @ConsultantName , 
       case when @DischargeDateTime = null then null else convert(datetime, STUFF(STUFF(STUFF(@DischargeDateTime,9,0,' '),12,0,':'),15,0,':')) end, 
     @DischargeDestination, 
     @DischargeMethod , 
     @FacilityCode , 
     @ReferralReason, 
     @ReferralAssigningAuthority, 
     @ReferrerName, 
     CURRENT_TIMESTAMP, 
     NULL, 
     0, 
     'UNPROCESSED', 
     @AppointmentTypeText, 
       case when @TCIDate = null then null else convert(datetime, STUFF(STUFF(STUFF(@TCIDate,9,0,' '),12,0,':'),15,0,':')) end, 
       @TCILocation); 
    set @return_value = 0 


    end try 
    begin catch 
     set @return_value = (SELECT ERROR_NUMBER() as Error_Number) 
     set @error_message = (SELECT ERROR_MESSAGE() as Error_Message) 
     RAISERROR (@error_message,10,1) 


    end catch; 
    return @return_value 
END 
+2

ストアドプロシージャは完全に無邪そうです。コードが決してコミットしないトランザクションを実際に開始していないことを確認します。これは、ロックを解除する最も簡単な方法です。 'DBCC OPENTRAN'があなたを助けます。また、アプリケーション/データベースが[暗黙のトランザクションを有効にする](https://msdn.microsoft.com/library/ms187807)のような恐ろしいことをしていないことを確認してください。 –

+1

私はAdam Machanicから[sp_WhoIsActive]を試してみましょう。[Brent Ozarのチュートリアル](https://www.brentozar.com/archive/2010/09/sql-server-dba-scripts-how-to-find-slow -sql-server-queries /) – SqlZim

+1

私はあなたのコードでTransactionScopeを有効にしていると思います。スコープが完了していないか、または例外がスローされていない間にブレークポイントを設定すると、同様の動作が表示されます。 –

答えて

0

すべてのTを示しています私が使用できる機能があるのであれば、私は疑問に思って

...ストアドプロシージャは、任意のものをブロックしていないよう、同様のコメントで述べたようにあなたが必要なもの、ストアドプロシージャ

への呼び出しは、現在実行中のステートメント、ブロッキングを、読み込みを指示するスクリプトです書き込みを作る時に実際に実行される-SQL ...

これは...アダムMachanicによってsp_whoisactiveストアドプロシージャを実行することにより、このような場合には

+0

SQLプロファイラを使用してSQLトレースファイルを作成することもお勧めします。すべてのストアドプロシージャ文を取得するようにイベント選択を設定してください(デフォルトを使用しないでください)。これにより、実行するすべてのSQL行と、各文が取られた時間、所要時間などを取得することができます。 – pmbAustin

+0

@pmbAustin:それ以上のinfo.extendedイベントも提供でき、プロファイラーよりも軽い主張が可能です – TheGameiswar

0

を行うことができ、私は通常、関連するLOCKすべてのイベントが選択されていることを確認し、T-SQLのテンプレートを使用してSQL Serverプロファイラをクランクアップ他の有用なビットと一緒に表示するには、DBフィルターを使用しないデータベースに設定して、私がイベントを捕捉していることを確認してから、そのデータベースに対してSPを実行してください。

通常、私の手のひらはすぐに私の額に近づいています:)

関連する問題