2013-10-21 39 views
0

我在此過程中遇到問題。它使用了幾個臨時表,它會丟棄並重新創建。這導致了大量的崩潰,我只能假設衝突正在發生。SQL Server 2005 - 在多用戶環境中使用臨時表

ALTER PROCEDURE [dbo].[AdditionalVisits_SelectByOrigID] 
(
@orig_job_ID int 
) 
as 

if exists (select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'additionalVisitsPodsCnt') 
    drop table additionalVisitsPodsCnt; 

SELECT  CONVERT(bit, COUNT(PODS.podID)) AS cnt, AdditionalVisits.this_job_id, AdditionalVisits.orig_job_id 
INTO   additionalVisitsPodsCnt 
FROM   PODS RIGHT OUTER JOIN 
        AdditionalVisits ON PODS.jobID = AdditionalVisits.this_job_id 
GROUP BY AdditionalVisits.this_job_id, AdditionalVisits.orig_job_id 
HAVING  (AdditionalVisits.orig_job_id = @orig_job_ID) 

if exists (select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'additionalVisitsPhotosCnt') 
drop table additionalVisitsPhotosCnt; 

SELECT  CONVERT(bit, COUNT(Photos.photoID)) AS cnt, AdditionalVisits.this_job_id, AdditionalVisits.orig_job_id 
INTO   additionalVisitsPhotosCnt 
FROM   Photos RIGHT OUTER JOIN 
        AdditionalVisits ON Photos.jobID = AdditionalVisits.this_job_id 
GROUP BY AdditionalVisits.this_job_id, AdditionalVisits.orig_job_id 
HAVING  (AdditionalVisits.orig_job_id = @orig_job_ID) 

SELECT  AdditionalVisits.id, AdditionalVisits.this_job_ID, AdditionalVisits.orig_job_ID, AdditionalVisits.reason, AdditionalVisits.date, ThisJob.Job_Reference_No, 
        ThisJob.Job_POD_Filename, ThisJob.Job_Photo_Filename, ThisJob.Job_Signed_For_Name, ThisJob.Job_Value, ThisJob.Job_Advance_Payment, 
        ThisJob.Job_Eoj_Payment, ThisJob.Job_Status, ThisJob.Job_Date_Added, ThisJob.Job_Start_Date, additionalVisitsPhotosCnt.cnt AS Job_Photo_Supplied, 
        additionalVisitsPodsCnt.cnt AS Job_POD_Supplied 
FROM   AdditionalVisits INNER JOIN 
        Jobs AS ThisJob ON AdditionalVisits.this_job_ID = ThisJob.Job_ID INNER JOIN 
        additionalVisitsPodsCnt ON AdditionalVisits.this_job_ID = additionalVisitsPodsCnt.this_job_id INNER JOIN 
        additionalVisitsPhotosCnt ON AdditionalVisits.this_job_ID = additionalVisitsPhotosCnt.this_job_id 
WHERE  (AdditionalVisits.orig_job_ID = @orig_job_ID) AND (ThisJob.Job_Status <> 7) 

我得到的錯誤如下:

Cannot drop the table 'additionalVisitsPodsCnt', because it does not exist or you do not have permission. There is already an object named 'additionalVisitsPodsCnt' in the database. 

Invalid object name 'additionalVisitsPhotosCnt'. 

這些錯誤是間歇性的。有時它只是起作用。

有沒有更好的方法來做到這一點?

+0

嘗試使用實際的臨時表在其名稱中的''#前綴。像'#additionalVisitsPodsCnt'一樣。 – RBarryYoung

回答

0

當然,如果這個表僅從這一個過程中使用,使用一個「真正的」 local temporary table(在tempdb創建),通過與#前綴表名:

SELECT CONVERT(bit, COUNT(PODS.podID)) AS cnt, 
     AdditionalVisits.this_job_id, AdditionalVisits.orig_job_id 
INTO   #additionalVisitsPodsCnt 
FROM   PODS .... 

這樣,它是從孤立所有其他會話,即使並行呼叫此程序是由其他人做出的。

+0

謝謝。這是一種享受。並做出非常迅速的迴應。 –

+0

然而,只要做一次理智檢查,以確保沒有其他東西依賴於表'additionalVisitsPodsCnt'和'additionalVisitsPhotosCnt'。 – StuartLC

0

這是我用於#temp表的正常模式。 (注意「#」前綴)。

IF OBJECT_ID('tempdb..#TableOne') IS NOT NULL 
begin 
     drop table #TableOne 
end 


CREATE TABLE #TableOne 
( 
SurrogateKey int , 
NameOf varchar(12) 
) 


/* 
Do something with temp table 
*/ 




IF OBJECT_ID('tempdb..#TableOne') IS NOT NULL 
begin 
     drop table #TableOne 
end 
+0

1)爲什麼你檢查表是否存在在開始?如果是這樣,那不會是意想不到的,如果你現在默默地放棄它,可能會出現問題嗎? 2)不是最後保證存在的表嗎?那麼爲什麼在放棄之前檢查存在? –

+0

代碼過早存在,有時可能會有一個#temp表被孤立。我是一名C#開發人員。我在使用它們之前檢查了一些事情(如果是null!= someObject {someObject.DoSomething();} ........)在簡單示例中沒有看到的是您可以調用嵌套存儲過程..和#temp表仍然在範圍內,所以nest-procedure可以刪除#temp表......因此,爲什麼我在刪除之前做了「檢查」。這是我猜想的一種風格的事情,但它的樣式我如何滾動。 – granadaCoder