Переменная SQL Server Set, если она существует, вставьте в таблицу - PullRequest
7 голосов
/ 31 января 2012

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

@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 ]

14 голосов
/ 31 января 2012

Попробуйте:

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 голос
/ 05 августа 2014

Здесь облегченная модификация ответа @Mithrandir. Вы можете использовать TOP 1, чтобы ускорить результат, если вы не сравниваете уникальное поле. например

DECLARE @EXISTS AS BIT
SET @EXISTS = 0
SELECT TOP 1 @EXISTS = 1 FROM MyTable WHERE MyYear = @Year
1 голос
/ 31 января 2012

Я протестировал этот фрагмент, и он работает правильно:

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
1 голос
/ 31 января 2012

Попробуйте это:

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

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

0 голосов
/ 10 сентября 2014

Попробуйте это забавное исключение. Помните, что нет 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
...