Получить значение IDENTITY в том же операторе T-SQL, в котором оно создано? - PullRequest
4 голосов
/ 17 ноября 2011

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

Возможно ли это (SQL Server 2008r2)?

Спасибо.

Ответы [ 5 ]

9 голосов
/ 17 ноября 2011

Вы не можете сделать это на самом деле - потому что фактическое значение, которое будет использоваться для столбца IDENTITY, действительно фиксировано и устанавливается только после завершения INSERT.

Однако вы можете использовать, например, триггер

CREATE TRIGGER trg_YourTableInsertID ON dbo.YourTable 
AFTER INSERT
AS 
UPDATE dbo.YourTable
SET dbo.YourTable.OtherID = i.ID
FROM dbo.YourTable t2
INNER JOIN INSERTED i ON i.ID = t2.ID

Это сработает сразу после вставки любых строк и установит для столбца OtherID значения столбцов IDENTITY для вставленных строк. Но, строго говоря, это не в том же утверждении - это просто после вашего исходного утверждения.

1 голос
/ 22 января 2015

О проверенном ответе:

Вы не можете сделать это на самом деле - потому что фактическое значение, которое будет использоваться для столбца IDENTITY, действительно только фиксировано и установлено после завершения INSERT.

marc_s Полагаю, вы на самом деле не правы. Да, он может! ))

Путь к решению IDENT_CURRENT():

CREATE TABLE TemporaryTable(
    Id int PRIMARY KEY IDENTITY(1,1) NOT NULL,
    FkId int NOT NULL 
)

ALTER TABLE TemporaryTable
    ADD CONSTRAINT [Fk_const] FOREIGN KEY (FkId) REFERENCES [TemporaryTable] ([Id])

INSERT INTO TemporaryTable (FkId) VALUES  (IDENT_CURRENT('[TemporaryTable]'))
INSERT INTO TemporaryTable (FkId) VALUES  (IDENT_CURRENT('[TemporaryTable]'))
INSERT INTO TemporaryTable (FkId) VALUES  (IDENT_CURRENT('[TemporaryTable]'))
INSERT INTO TemporaryTable (FkId) VALUES  (IDENT_CURRENT('[TemporaryTable]'))

UPDATE TemporaryTable 
   SET [FkId] = 3
 WHERE Id = 2

SELECT * FROM TemporaryTable

DROP TABLE TemporaryTable

Более того, вы даже можете использовать IDENT_CURRENT() как DEFAULT CONSTRAINT и он работает вместо SCOPE_IDENTITY() например.Попробуйте это:

CREATE TABLE TemporaryTable(
    Id int PRIMARY KEY IDENTITY(1,1) NOT NULL,
    FkId int NOT NULL DEFAULT IDENT_CURRENT('[TemporaryTable]')
)

ALTER TABLE TemporaryTable
    ADD CONSTRAINT [Fk_const] FOREIGN KEY (FkId) REFERENCES [TemporaryTable] ([Id])

INSERT INTO TemporaryTable (FkId) VALUES (DEFAULT)
INSERT INTO TemporaryTable (FkId) VALUES (DEFAULT)
INSERT INTO TemporaryTable (FkId) VALUES (DEFAULT)
INSERT INTO TemporaryTable (FkId) VALUES (DEFAULT)

UPDATE TemporaryTable 
   SET [FkId] = 3
 WHERE Id = 2

SELECT * FROM TemporaryTable

DROP TABLE TemporaryTable
1 голос
/ 17 ноября 2011

Вы можете сделать это, имея вычисляемый столбец в вашей таблице:

 DECLARE    @QQ TABLE (ID INT IDENTITY(1,1), Computed AS ID PERSISTED, Letter VARCHAR (1))

INSERT INTO @QQ (Letter)
VALUES ('h'),
('e'),
('l'),
('l'),
('o')

SELECT  *
FROM    @QQ

1   1   h

2   2   e

3   3   l

4   4   l

5   5   o
0 голосов
/ 27 ноября 2017

используйте этот простой код `SCOPE_IDENTITY () + 1

0 голосов
/ 17 ноября 2011

Вы можете сделать оба.

Чтобы вставить строки со столбцом «идентичность», вам необходимо set identity_insert off.

Обратите внимание, что вы все еще не можете дублировать значения!

Вы можете увидеть команду здесь . Будьте внимательны к set identity_insert on впоследствии.

Чтобы создать таблицу с той же записью, вам просто необходимо:

  • создать новый столбец;
  • вставить его с нулевым значением или другой вещью;
  • обновить этот столбец после вставок значением столбца идентификаторов.

Если вам нужно вставить значение одновременно, вы можете использовать глобальную переменную @@identity. Это даст вам последний вставленный. Поэтому я думаю, что вам нужно сделать @@identity + 1. В этом случае он может давать неправильные значения, потому что @@identity для всех таблиц. Поэтому он будет считать, если вставка происходит в другой таблице с идентификатором.

Другое решение - получить максимальный идентификатор и добавить его :), и вы получите необходимое значение!

...