2012-01-31 2 views
7

Я ищу более эффективный способ выполнения этой задачи. Мне нужно установить переменную, равную ID, если она существует, а если не вставить ее, а затем установить переменную в вставленную идентификационную информацию. Я могу сделать это, выполнив следующие действия:SQL Server Установить переменную, если она существует, вставить в таблицу

@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

Try:

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 
) 

Тогда, если вам нужен идентификатор вы должны установить переменную в @@ IDENTITY. Я думаю, что это наиболее эффективно, так как вы не делаете третий запрос, а просто добавляете последний идентификатор.

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

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 
Смежные вопросы