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