如何解决sql server中的“对象已存在”错误

dpiehjr4  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(549)

我正在尝试使用不同的数据范围运行查询,但由于某种原因,当我运行它时,它会返回一个错误,说明:
msg 2714,16级,状态6,第54行
数据库中已存在名为“##contacts”的对象。
我该怎么办?是数据库中创建的列还是需要删除的列?
我使用的代码:

use KBData
go

declare 
    @startdate datetime='2010-01-01',
    @enddate datetime = '2020-05-26';

/*from contacts*/
select
    lower(c.contactid) as contactid ,
    replace(replace(lower(c.emailaddress1),' ',''),',','') as emailaddress1,
    replace(replace(lower(c.emailaddress2),' ',''),',','') as emailaddress2,
    replace(replace(lower(c.emailaddress3),' ',''),',','') as emailaddress3
into ##contacts
from crm.Contact c
where (c.createdonutc >= @startdate and c.createdonutc < dateadd(dd,1,@enddate))
and (c.emailaddress1 is not null or c.emailaddress2 is not null or c.emailaddress3 is not null)

/*from buyers*/
select 
    lower(b.Email) as email
into #sales
from crm.SalesAgreement s  
left join dbo.BuyerContracts bc
    join dbo.buyers b
    on b.ProspectNo = bc.ProspectNo
    and b.Deleted is null  
    on s.kb_salesagreementnumber = bc.SalesAgreementNo
    and bc.Deleted is null
where (s.kb_saledate >= @startdate and s.kb_saledate < dateadd(dd,1,@enddate))
and s.Deleted is null   ;

select
    distinct replace(replace(lower(b.email),' ',''),',','') as email
into #buyers
from #sales b
where b.Email is not null ;
iibxawm4

iibxawm41#

您遇到的问题源于您对全局临时表的使用( ##tableName )而不是本地临时表( #tableName ). 两人的行为不同。
本地临时表是动态创建的,只能从创建它的会话访问,并且在该会话关闭其连接时删除,或者除非在此之前显式删除。它完全包含在这个范围内。
全局临时表也是动态创建的,但是可以通过与服务器的任何连接进行访问。例如(我今天早些时候刚刚做了这个),您可以在一个ssms窗口中创建一个全局temp表,然后在多个其他ssms窗口中使用该表。或者你团队中的其他人也可以处理。该表将继续存在,直到访问该表的最后一个会话断开连接,或者,除非在此之前显式删除该表。
因此,如果有两个会话打开并运行此代码 ##contacts 当第二个会话尝试创建它时,来自一个会话的消息将已经存在。有一些情况需要一个全局临时表,并且需要在这些情况下执行存在性检查之类的操作,但是它们很少。使用本地临时表通常更容易。

相关问题