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