У меня есть следующая временная таблица с индексом. Это работает, поскольку я явно называю это IX_#Final_1.
Как создать индекс без явного имени?
CREATE TABLE [#Test1]
(
[ID] INT IDENTITY(1, 1) PRIMARY KEY,
[Member_BK] VARCHAR(20),
[Company] VARCHAR(20),
[Facility_Name] VARCHAR(200),
INDEX [IX_#Final_1] ([Member_BK], [Company])
)
Мне это нужно из-за проблем, описанных в dba.stackexchange.com. В базе данных уже есть объект с именем PK_MyPrimaryKey (первичный индекс во временной таблице)
Синтаксис CREATE TABLE поддерживает только неявные имена (каждый индекс получает имя независимо от того, указываете вы его или нет) для ограничений PRIMARY KEY и UNIQUE. Если это уникальный индекс, отбросьте имя и замените INDEX ключевым словом UNIQUE, например: db<>fiddle.
«В базе данных уже есть объект с именем PK_TempId» — это создание ограничения. Для индексов нет такого требования, чтобы имя было уникальным в пределах схемы. Он должен быть уникальным только внутри каждой таблицы.
Чтобы обойти эти проблемы, вы можете добавить имя SP, создающего таблицу, к имени индекса.
Вам это вообще не «нужно», во многом вам не «нужен» молоток, чтобы закрутить шуруп в стену. Вы всегда должны давать своим объектам явные имена, а не полагаться на неявные.
@ThomA - это неверно для ограничений во временных таблицах, созданных хранимыми процессами. Они всегда должны использовать неявные имена, так как в противном случае вы сможете создать только один экземпляр таблицы, и попытки одновременного выполнения процесса завершится неудачей по этой причине, а явные имена ограничений также предотвратят кэширование объектов временной таблицы.





Мне это нужно из-за проблем, описанных в dba.stackexchange.com: В базе данных уже есть объект с именем PK_MyPrimaryKey ( первичный индекс во временной таблице)
Нет, ты не знаешь. Это не удается (с ошибкой «В базе данных уже есть объект с именем «PK1»).
DROP TABLE IF EXISTS #T1, #T2
CREATE TABLE #T1 ([ID] INT CONSTRAINT PK1 PRIMARY KEY)
CREATE TABLE #T2 ([ID] INT CONSTRAINT PK1 PRIMARY KEY)
Поскольку он создает ограничение и соответствующий объект в sys.objects — где имена объектов должны быть уникальными в пределах схемы.
Это не
DROP TABLE IF EXISTS #T1, #T2
CREATE TABLE #T1 ([ID] INT NOT NULL INDEX IX UNIQUE CLUSTERED)
CREATE TABLE #T2 ([ID] INT NOT NULL INDEX IX UNIQUE CLUSTERED)
Имена индексов должны быть уникальными только внутри таблицы — нет проблем с одновременно существующими несколькими разными таблицами, которые используют общие имена индексов. Многие из встроенных объектов имеют довольно скучные индексные имена, такие как clst, как видно из.
SELECT name,
COUNT(*),
type_desc
FROM sys.indexes
GROUP BY name,
type_desc
HAVING COUNT(*) > 1
ORDER BY COUNT(*) DESC
SQL Server 2000 даже не имел этого ограничения и допускал дублирование имен индексов внутри таблицы. Если вы были в таком положении, то решение этого вопроса было необходимым изменением перед обновлением до версии 2005.
Я удалил свой пост - вы правы, пере#нейминг. Хотя я клянусь, что имя индекса #temp где-то устранило проблему, я просто не могу вспомнить, где. В любом случае, ставлю вам палец вверх.
Я не понимаю... если вы можете явно выбрать имя индекса, то почему вы не можете использовать имя, не вызывающее конфликтов?