Perl, SQL Server использует @@IDENTITY

#sql-server #perl

#sql-сервер #perl

Вопрос:

У меня есть таблица SQL Server со столбцом identity, для которого установлено значение autoincrement.

Закодированная на Perl вставка в приведенный ниже код работает нормально, в цикле while fetchrow_array() вызов не возвращает никаких данных в массиве @row .

Как мне лучше всего получить значение identity для использования в последующих операторах SQL?

 my $term_sql = "INSERT INTO reminder_term(site, name, description, localization) OUTPUT @@IDENTITY VALUES(?,?,?,?)";
my $t_stmt = $dbh->prepare($term_sql);
...
$t_stmt->execute($site, $name, $description, $localizer);
 
while (@row = $t_stmt->fetchrow_array()) {
    $referential_key = $row[0];
}
 

Комментарии:

1. Если у вас нет переменных (или последовательностей, таких как «t» или «n») в вашей строке, вы можете использовать одинарные кавычки. Тогда вам не нужно будет экранировать символы «@». my $term_sql = 'INSERT INTO reminder_term(site, name, description, localization) OUTPUT @@IDENTITY VALUES(?,?,?,?)';

Ответ №1:

Избегайте использования значения @@IDENTITY, поскольку оно ненадежно при наличии триггеров.

Приведен пример схемы таблицы…

 create table [dbo].[reminder_term] (
  [id] int not null identity(1,1),
  [site] nvarchar(10),
  [name] nvarchar(10),
  [description] nvarchar(10),
  [localization] nvarchar(10)
);
 

Вы можете немного переработать свое предложение ВЫВОДА, вы можете получить новое id значение с помощью специального inserted источника строк…

 INSERT INTO reminder_term(site, name, description, localization)
OUTPUT inserted.id
VALUES(?,?,?,?)