2012-01-31 73 views
7

我正在寻找更有效的方式来完成此任务。如果它存在,我需要设置一个变量等于一个ID,如果不插入它,然后将该变量设置为插入的身份。我可以通过执行实现这一目标如下:SQL Server设置变量是否存在else else insert into table

@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 

但是似乎低效运行两次相同的查询(检查是否存在,如果它不设置变量)

只是寻找一个更好的办法的建议完成这项任务。

回答

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

试试这个:

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

然后,如果你需要的ID,你就必须设置该变量的@@ IDENTITY。我认为这是最有效的,因为你没有进行第三次查询,但只是得到插入的最后一个ID。

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 
+0

+1对于SET语法,对于ansi。 – goodeye 2014-06-09 18:35:41

1

这里一个精简版的修改@Mithrandir答案。您可以使用TOP 1,以帮助您在不比较唯一字段时加快结果。例如

DECLARE @EXISTS AS BIT 
SET @EXISTS = 0 
SELECT TOP 1 @EXISTS = 1 FROM MyTable WHERE MyYear = @Year 
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