2017-02-22 50 views
1

我有一個正在執行插入的存儲過程。但是,一旦我執行該存儲過程,鎖就會保留在數據庫中,並且不可能有進一步的插入。事實上,你甚至無法在桌上做選擇。SQL Server - 確定什麼是鎖定數據庫

當我在Management Studio中執行調用時,似乎報告了兩個選擇,但在存儲過程中只有一個選擇。

所以我想知道如果有一個功能,我可以用它列出了所有當您對存儲過程的調用

源的存儲過程如下:即實際執行的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 Profiler來生成SQL跟蹤文件。只需確保設置事件選擇以獲取所有存儲過程語句(即不使用默認值)。這可以讓你執行每條SQL線,以及每條語句花費多長時間等等。 – pmbAustin

+0

@pmbAustin:是的,它提供了更多的info.extended事件也可以幫助並聲稱比profiler更多的光 – TheGameiswar

0

在這樣的情況下,我通常殺青使用T-SQL模板中的SQL Server事件探查,確保所有相關LOCK事件的選擇與其他有用的位一起顯示,將數據庫過濾器設置爲一個未使用的數據庫,以確保我只捕獲我的事件,然後針對該數據庫運行SP。

通常,在約五到十五分鐘內,我的手掌快速接近我的額頭:)