临时表:具有默认名称的主键已存在

时间:2017-04-10 10:43:29

标签: sql sql-server primary-key

我在存储过程中有以下代码,在游标中运行

IF (OBJECT_ID('tempdb..#newSales','U') IS NOT NULL)
    DROP TABLE #newSales

CREATE TABLE #newSales
(
    AddressId INT NOT NULL,
    ItemId INT NOT NULL,
    [Date] DATE NOT NULL,
    Sale REAL NULL
)

/* some code here */

ALTER TABLE #newSales 
    ADD PRIMARY KEY CLUSTERED ([AddressId] ASC, [ItemId] ASC, [Date] ASC)

我会定期收到以下错误(每次名称都不同):

  

已经有一个名为' PK __#newSale__34CE1EAA297D3472'在数据库中。

我已经检查了类似的问题,但大多数都是明确命名的约束。我无法理解这是如何发生的,因为在这种情况下,PK的名称是自动生成的,理论上它必须是唯一的(即使有多个连接调用此过程)。

可能是错误的来源是什么?

1 个答案:

答案 0 :(得分:1)

您应该避免创建并发可能存在问题的临时表,并尝试使用变量表。请尝试以下方法:

DELCARE @newSales TABLE 
(
    AddressId INT NOT NULL,
    ItemId INT NOT NULL,
    [Date] DATE NOT NULL,
    Sale REAL NULL,
    PRIMARY KEY CLUSTERED ([AddressId] ASC, [ItemId] ASC, [Date] ASC)
)

INSERT INTO @newSales
SELECT *
FROM myOtherTables
...