Transact-SQL / Проверить, если имя уже существует - PullRequest
3 голосов
/ 17 августа 2010

Простой вопрос здесь.

Контекст: Таблица Transact-SQL с первичным ключом int и именем, которое также должно быть незаполненным (даже если это не первичный ключ).Допустим:

TableID INT,
TableName NVARCHAR(50)

Я добавляю новые строки в это состояние с помощью хранимой процедуры (и, таким образом, определяя TableName с параметром).

Вопрос: Какой самый лучший / простой способ проверить, существует ли уже предоставленный параметр TableName в таблице, и предотвратить добавление новой строки, если это так?

Возможно ли сделать это непосредственно в моем AddNewRowхранимая процедура?

Ответы [ 3 ]

6 голосов
/ 17 августа 2010

Если вы используете SQL Server 2008, вы можете использовать оператор MERGE в своем sproc:

MERGE INTO YourTable AS target
USING (VALUES (@tableName)) AS source (TableName)
    ON target.TableName = source.TableName
WHEN NOT MATCHED THEN
    INSERT (TableName) VALUES (TableName)

Вы все равно должны убедиться, что столбец TableName имеет ограничение UNIQUE .

5 голосов
/ 17 августа 2010

Чтобы добавить уникальное ограничение на TableName и обработать ошибку, если вы попытаетесь вставить дубликат.

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

См. связанный вопрос .

2 голосов
/ 17 августа 2010

Я бы предпочел использовать Unique Constraint для столбца, а затем явно проверять его наличие.

Обработка исключения приведет к увеличению идентификатора, если оно есть,

Во-вторых, исключения можно избежать, проверив наличие перед вставкой, что является более дорогой операцией.

IF EXISTS (SELECT TOP(1) ColName FROM MyTable WHERE ColName=@myParameter)

При использовании ограничения уникальности вы также можете применить Unique Nonclustured index, что приведет к быстрому извлечению вместе с ним.

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