SQL Server Set变量,如果存在,则插入表中

时间:2012-01-31 18:53:33

标签: sql-server-2008 stored-procedures exists

我正在寻找一种更有效的方法来完成这项任务。我需要设置一个等于ID的变量(如果存在),如果不存在,则将变量设置为插入的标识。我可以通过以下方式实现这一目标:

@VariableName --sent through to stored procedure

DECLARE @VariableID [int]

IF EXISTS(SELECT VariableID FROM VariableTable WHERE VariableName = @VariableName)
    SET @VariableID = (SELECT VariableID FROM VariableTable WHERE VariableName = @VariableName)
ELSE 
    INSERT INTO VariableTable(VariableName) VALUES(@VariableName)
    SET @VariableID = SCOPE_IDENTITY();
END

然而,运行相同的查询两次似乎效率低下(检查是否存在以及是否设置了变量)

只是寻找有关更好地完成此任务的建议。

5 个答案:

答案 0 :(得分:14)

尝试:

DECLARE @VariableID [int]
SELECT @VariableID=VariableID FROM VariableTable WHERE VariableName = @VariableName

IF @VariableID IS NULL
BEGIN
    INSERT INTO VariableTable(VariableName) VALUES(@VariableName)
    SET @VariableID = SCOPE_IDENTITY();
END

答案 1 :(得分:1)

试试这个:

INSERT INTO VariableTable (VariableID )
 SELECT SCOPE_IDENTITY()
FROM VariableTable
WHERE not exists
(
 SELECT VariableID FROM VariableTable WHERE VariableName = @VariableName
)

然后,如果您需要id,则必须将变量设置为@@ IDentity。我认为这是最有效的,因为你没有进行第三次查询,只是插入最后一个ID。

答案 2 :(得分:1)

我测试了这个代码段并且它正确执行:

DECLARE @VariableID [int]
SET @VariableID=(SELECT VariableID FROM VariableTable WHERE VariableName = @VariableName)
IF @VariableID IS NULL
BEGIN
  INSERT INTO VariableTable(VariableName) VALUES(@VariableName)
  SET @VariableID = SCOPE_IDENTITY();
END

答案 3 :(得分:1)

这里是对@Mithrandir的修改。您可以使用TOP 1来帮助您在不与唯一字段进行比较时加快结果。例如

DECLARE @EXISTS AS BIT
SET @EXISTS = 0
SELECT TOP 1 @EXISTS = 1 FROM MyTable WHERE MyYear = @Year

答案 4 :(得分:0)

尝试这个有趣的例外。请记住,没有BEGIN和END,因此IF之后的下一个语句应该是有条件的。现在问问自己为什么存在第一个变量:

declare @check binary
declare @predeclared varchar(100)
select @check = 0

if @check = 1
   declare @conditionaldeclare nvarchar(4000)
   select @conditionaldeclare = 'conditionaldeclare'
   print @conditionaldeclare


if @check = 1
   select @predeclared = 'predeclared'
   print @predeclared