Transact-SQL /检查名称是否已存在

时间:2010-08-17 16:28:18

标签: sql-server tsql sql-server-2008 merge

这里的简单问题。

上下文:具有int主键的Transact-SQL表,以及也必须是unqiue的名称(即使它不是主键)。让我们说:

TableID INT,
TableName NVARCHAR(50)

我正在通过存储过程为此功能添加新行(因此,使用参数指定TableName)。

问题:验证表中是否已存在提供的TableName参数的最佳/最简单方法是什么?如果是这种情况,则阻止添加新行?

可以直接在我的AddNewRow存储过程中执行此操作吗?

3 个答案:

答案 0 :(得分:6)

如果您正在使用SQL Server 2008,那么您可以在您的sproc中使用MERGE语句:

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 constraint

答案 1 :(得分:5)

要在TableName上添加唯一约束,并在尝试插入副本时处理错误。

这可以避免并发事务中的任何问题,在您阅读它不存在并尝试插入之间插入重复项。

请参阅此related question

答案 2 :(得分:2)

我更希望在列上使用Unique Constraint,然后明确检查其存在性。

处理异常将导致身份增量(如果存在),

其次可以通过在插入之前检查存在来避免异常,其他方面是更昂贵的操作。

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

如果使用唯一约束,您还可以将Unique Nonclustured index应用于快速检索。