Определить текущую вставляемую строку - PullRequest
1 голос
/ 24 августа 2011

Я работаю над проектом, и возник вопрос: может ли оператор вставки вставить свою собственную идентификацию в другое поле?

Идея состоит в том, что будет иерархическое расположение записей и чтоПоле 'parent' будет указывать на идентификатор родительской записи, и что 'верхняя' запись для данного дерева будет просто указывать на себя.

Конечно, мы можем просто оставить его нулевым для родителя или вернутьсяи введите его идентификатор позже.Но мне было интересно, была ли какая-либо операция SQL Server для вставки IDENTITY в другое поле при вставке записи?

РЕДАКТИРОВАТЬ: Или есть способ указать значение по умолчанию для поля, которое будетзначение другого поля?Это также решило бы проблему.

РЕДАКТИРОВАТЬ: поле по умолчанию, являющееся другим полем, уже получено ответ, кажется, и ответ нет, используйте триггер.Конечно, это не помогает проблеме ограничений и ненулевых полей.(http://social.msdn.microsoft.com/Forums/en/sqltools/thread/661d3dc8-b053-47b9-be74-302ffa11bf76)

Ответы [ 2 ]

0 голосов
/ 24 августа 2011

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

create table hierarchy (
    id int identity(1,1) not null primary key, 
    parent_id int null, 
    somefield varchar(100));


insert into hierarchy (parent_id, somefield)
    output inserted.id, 'child'
    into hierarchy (parent_id, somefield)
values (null, 'parent');    

select * from hierarchy;

Я не вижу никакого практического применения в конце концов, это скорее шоу-хет-трик.

0 голосов
/ 24 августа 2011

Нет. Для иерархии такого типа, если вы не вставляете явные значения ID с помощью SET IDENTITY_INSERT ON, вам необходимо сначала вставить верхний уровень и использовать предложение SCOPE_IDENTITY или OUTPUT, чтобы получить вставленные значения ID для следующий уровень вниз.

...