Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как избежать ошибки "Object already exists" при создании PK на временной таблице?  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
Пишу отчеты, источником для которых служат хранимые процедуры под 2008 R2.
Когда одновременно запускается больше одного отчета, использующего в процедуре вот такой код:

    CREATE TABLE #t (
         HRBusinessUnitId   VARCHAR(50) NOT NULL
        ,RegionId           INT         NOT NULL
        ,lineId             INT         NOT NULL
        ,FiscalYear         INT         NOT NULL
        ,metric             VARCHAR(20) NOT NULL
        ,Data               FLOAT       NOT NULL
        ,CONSTRAINT pk_t PRIMARY KEY CLUSTERED (
             HRBusinessUnitId
            ,RegionId
            ,lineId
            ,FiscalYear
            ,metric
        )
    )

выдается ошибка. Разбив имя индекса по процедурам я отсеку какой-то процент ошибок, но хотелось бы защитить код на 100%.
Это должно быть распространенной проблемой, но поиск в гугле по temp

table primary key "object already exists"

ничего полезного не выдал. В крайнем случае можно не создавать ключ по этим полям - время выполнения возрастет с пары секунд дл 5-4 секунд, но этого варианта хотелось бы избежать.
13 ноя 13, 03:08    [15119023]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать ошибки "Object already exists" при создании PK на временной таблице?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Gobzo Kobler,

CREATE TABLE #t (
        HRBusinessUnitId   VARCHAR(50) NOT NULL
    ,RegionId           INT         NOT NULL
    ,lineId             INT         NOT NULL
    ,FiscalYear         INT         NOT NULL
    ,metric             VARCHAR(20) NOT NULL
    ,Data               FLOAT       NOT NULL
)

CREATE UNIQUE CLUSTERED INDEX pk_t ON #t 
(
    HRBusinessUnitId
    ,RegionId
    ,lineId
    ,FiscalYear
    ,metric
);
13 ноя 13, 03:42    [15119034]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать ошибки "Object already exists" при создании PK на временной таблице?  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3349
Gobzo Kobler,

Или, как вариант, переложить проблему с больной головы на здоровую:
CREATE TABLE #t (
         HRBusinessUnitId   VARCHAR(50) NOT NULL
        ,RegionId           INT         NOT NULL
        ,lineId             INT         NOT NULL
        ,FiscalYear         INT         NOT NULL
        ,metric             VARCHAR(20) NOT NULL
        ,Data               FLOAT       NOT NULL
        ,PRIMARY KEY (
             HRBusinessUnitId
            ,RegionId
            ,lineId
            ,FiscalYear
            ,metric
        )
    );
13 ноя 13, 04:00    [15119039]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать ошибки "Object already exists" при создании PK на временной таблице?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31785
Gobzo Kobler
Это должно быть распространенной проблемой
Обычно для временных таблиц не нужно присваивать определённое имя для ПК, так что обычно это не проблема.
13 ноя 13, 10:51    [15119778]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать ошибки "Object already exists" при создании PK на временной таблице?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Gobzo Kobler
Это должно быть распространенной проблемой, но поиск в гугле по temp
table primary key "object already exists" ничего полезного не выдал

Естественно, это распространённая проблема. Но если самому выдумать сообщение об ошибке, то ничего и не найдётся. Оригинальный текст ошибки такой:
автор
Msg 2714, Level 16, State 5, Line 1
There is already an object named 'pk_t' in the database.

Следовательно, вводим в гугл что-то вроде temp table primary key "there is already an object", и получаем гору ссылок.
13 ноя 13, 11:04    [15119865]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать ошибки "Object already exists" при создании PK на временной таблице?  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
Поскольку создать FOREIGN KEY, ссылающийся на PK временной таблицы невозможно,
значение имеет только уникальнось по полям PK.
Так что есть ли смысл заморачиваться?
13 ноя 13, 13:45    [15121352]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать ошибки "Object already exists" при создании PK на временной таблице?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
iap
Поскольку создать FOREIGN KEY, ссылающийся на PK временной таблицы невозможно,
значение имеет только уникальнось по полям PK.
Так что есть ли смысл заморачиваться?

Не очень понятно, причём здесь FK. Внешний ключ ведь ссылается не на PK/UI, а на столбцы в таблице.

Имя индекса может понадобиться разве что в хинтах. Примём, если PK создан как clustered, то можно смело указывать номер индекса: with(index(1)). Ну а если PK создан как nonclustered, то вроде как должно быть with(index(2)), но это вроде как и не гарантировано :)
13 ноя 13, 14:29    [15121468]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать ошибки "Object already exists" при создании PK на временной таблице?  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
Гость333
Gobzo Kobler
Это должно быть распространенной проблемой, но поиск в гугле по temp
table primary key "object already exists" ничего полезного не выдал

Естественно, это распространённая проблема. Но если самому выдумать сообщение об ошибке, то ничего и не найдётся. Оригинальный текст ошибки такой:
автор
Msg 2714, Level 16, State 5, Line 1
There is already an object named 'pk_t' in the database.

Следовательно, вводим в гугл что-то вроде temp table primary key "there is already an object", и получаем гору ссылок.


Да, если бы SSRS позволяла скопировать сообщение об ошибке в буфер, и меня не отвлекали, то я бы не ошибся с его текстом.
13 ноя 13, 19:04    [15124171]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить