Как обойти ошибку «Объект уже существует» на сервере SQL - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь запустить запрос с другим диапазоном данных, но по какой-то причине, когда я его запускаю, он возвращает сообщение об ошибке:

Msg 2714, Level 16, State 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 Ответ

1 голос
/ 27 мая 2020

Проблема, с которой вы столкнулись, связана с использованием вами глобальной временной таблицы (##tableName), а не локальной временной таблицы (#tableName). Оба ведут себя по-разному.

Локальная временная таблица создается на лету, доступна только из сеанса, в котором она создана, и удаляется, когда этот сеанс закрывает соединение, или если она не была явно удалена до этого . Он полностью содержится в этой области.

Глобальная временная таблица также создается «на лету», но затем доступна через любое соединение с сервером. Например (и я как раз делал это ранее сегодня), вы можете создать глобальную временную таблицу в одном окне SSMS, а затем работать с этой таблицей в нескольких других SSMS windows. Или с ним может работать кто-то из вашей команды. Таблица продолжает существовать до тех пор, пока последний сеанс, обращающийся к таблице, не будет отключен, или, кроме того, если он явно не удален до этого.

Итак, если бы у вас было два открытых сеанса с запущенным этим кодом, ##contacts из одного сеанса уже существовал бы, когда второй сеанс пытается его создать. Есть несколько ситуаций, когда вам нужна глобальная временная таблица, и вам нужно делать проверки существования и тому подобное в этих ситуациях, но их немного и далеко друг от друга. Обычно проще работать с локальными временными таблицами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...