SQL Server 2005-在多用户环境中使用临时表

SQL Server 2005-在多用户环境中使用临时表,sql,sql-server,Sql,Sql Server,我对这个程序有问题。它使用了几个临时表,可以删除并重新创建这些表。这导致了大量的崩溃,我只能假设冲突正在发生 ALTER PROCEDURE [dbo].[AdditionalVisits_SelectByOrigID] ( @orig_job_ID int ) as if exists (select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'additionalVisitsPodsCnt') drop table

我对这个程序有问题。它使用了几个临时表,可以删除并重新创建这些表。这导致了大量的崩溃,我只能假设冲突正在发生

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)

这些错误是间歇性的。有时它只是起作用


有更好的方法吗?

当然,如果此表仅从这一个过程中使用,请使用“real”(在
tempdb
中创建),方法是在表名前面加上


通过这种方式,它与所有其他会话隔离,即使其他人同时调用此过程。

这是我用于临时表的正常模式。(注意“#”前缀)


考虑改用表变量


比我解释得更好……;)

尝试使用名称中带有
#
前缀的实际临时表。就像
#additionalVisitsPodsCnt
。但是,只需进行一次健全性检查,以确保没有其他内容依赖于表
additionalVisitsPodsCnt
additionalVisitsPhotosCnt
。1)为什么要在开始时检查表是否存在?如果是这样的话,这不是出乎意料吗?如果你现在默默地放弃它,这可能会成为一个问题吗?2) 这张桌子不是保证在最后存在吗?那么,为什么要在删除它之前检查它的存在性呢?早熟的代码存在,有时会有一个#temp表成为孤立的。我是一名c#开发者。在我使用它们之前,我会检查东西(如果null!=someObject{someObject.DoSomething();}……。。在简单的示例中,你看不到的是,你可以调用一个嵌套的存储过程..,#temp表仍然在作用域中,因此嵌套过程可以删除#temp表..。这就是为什么我要“检查”我想这是一件时尚的事情,但这是我的风格。
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'.
SELECT  CONVERT(bit, COUNT(PODS.podID)) AS cnt, 
        AdditionalVisits.this_job_id, AdditionalVisits.orig_job_id
INTO            #additionalVisitsPodsCnt
FROM         PODS ....
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