Возвращает ли @@ identity первичный ключ или поле идентификации? - PullRequest
3 голосов
/ 12 мая 2010

Моя проблема в том, что у меня есть триггеры обновления в представлении SQL (MS SQL 2005), которые я сопоставляю с сущностями LINQ to SQL в C # ...

Мой SQL выглядит правильно, но он жалуется на попытку вставить нулевое значение в поле PK вторичной таблицы.

Я считаю, что моя проблема связана с наличием первичного ключа и идентификатора как отдельных полей в первичной таблице. Итак, мой вопрос заключается в следующем ... при использовании @@ identity, он смотрит на первичный ключ вставленной строки или в поле с указанным "IDENTITY" ???

Ответы [ 3 ]

12 голосов
/ 12 мая 2010

@@IDENTITY возвращает только значение идентификатора из последней вставки. Он не знает, использовалось ли это значение в столбце первичного ключа или даже будет ли оно уникальным для данного столбца. Вместо использования @@IDENTITY следует использовать SCOPE_IDENTITY(), особенно если у вас есть триггеры. @@ IDENTITY заботится только о столбце (в таблице может быть только один), который имеет атрибут IDENTITY. Независимо от того, имеет ли таблица первичный ключ или нет, и является ли PK столбцом идентификаторов, не имеет значения.

Подробнее см. SCOPE_IDENTITY .

2 голосов
/ 12 мая 2010

Вы хотите использовать SELECT SCOPE_IDENTITY() вместо @@Identity

0 голосов
/ 12 мая 2010

@@ IDENTITY всегда ссылается на столбец идентификации, а не на первичный ключ таблицы. (Как бы это работало, если бы это был составной первичный ключ?) Как говорит Томас, поскольку вы работаете с триггерами, вам, вероятно, следует использовать SCOPE_IDENTITY ().

...