получите новый идентификатор записи SQL

Я думаю, что вам не хватает ваших зависимостей. Пожалуйста, запустите

composer install

в корневом каталоге, чтобы установить зависимости

10
задан Milen A. Radev 26 February 2009 в 15:30
поделиться

8 ответов

Спасибо всем, кто предложил SELECT SCOPE_IDENTITY (). Мне удалось создать хранимую процедуру:

USE [dbname]
GO 
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[spInsert]
(
   @Nn varchar(30)
)
AS
BEGIN TRANSACTION InsertRecord 
   INSERT INTO A (Nn) 
   VALUES (@Nn) 
   SELECT NewID = SCOPE_IDENTITY()   -- returns the new record ID of this transaction
   COMMIT TRANSACTION InsertRecord

и вызвать sproc с помощью VB:

Dim strNn '<- var to be passed'
Set cn = Server.CreateObject("ADODB.Connection") 
connectString = "DSN" 
cn.Open connectString, "user", "PW0rd" 
Set rs = Server.CreateObject("ADODB.Recordset") 
set rs = cn.Execute("EXEC [dbname].[dbo].[A] @Nn=" & strNn)
'return the value'
resultID = rs(0)

Теперь я могу использовать resultID в любое время, когда ссылаюсь на вновь созданный идентификатор.

0
ответ дан 3 December 2019 в 13:28
поделиться
SELECT SCOPE_IDENTITY() 

использование @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ могут иметь неожиданные результаты, так быть осторожными, как Вы используете тот. Триггеры, которые вставляют записи на другие таблицы, заставят @@ значение ИДЕНТИФИКАЦИОННЫХ ДАННЫХ изменяться - где SCOPE_IDENTITY () даст Вам последние идентификационные данные только от Вашей текущей области.

Вот образец, который это покажет различию между @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ и SCOPE_INSERT () и как они могут возвратить различные значения..

use tempdb
go
create table table1
    (ID int identity)
go
create table table2
    (ID int identity(100, 1))
go
create trigger temptrig 
    on table1 
    for insert
as
begin

    insert  table2 
     default values;

end
go
insert  table1 
default values;
select  SCOPE_IDENTITY(), 
        @@IDENTITY

Другая опция, которую никто не обсудил здесь, состоит в том, чтобы использовать ВЫХОДНОЙ пункт, который находится в SQL 2005. В этом случае необходимо было бы просто добавить выходной пункт к вставке и затем поймать это recordset из кода. Это работает хорошо при вставке нескольких записей вместо всего 1...

use tempdb
go
create table table1
    (ID int identity)
go
insert   table1 
output   inserted.ID
default values;
--OR...
insert   table1 
output   inserted.$identity
default values;
25
ответ дан 3 December 2019 в 13:28
поделиться

Вы выполняете запрос

select scope_identity()

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

select scope_identity() as lastId
1
ответ дан 3 December 2019 в 13:28
поделиться

ВЫБЕРИТЕ @@, ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ обычно работают, но могли возвратить идентификационные данные записи, вставленной из-за триггера или чего-то а не оригинала.

ИЗБРАННЫЙ SCOPE_IDENTITY - то, что я рекомендовал бы. Это возвращает значения вставленный только в текущей области.

Существует также "IDENT_CURRENT (имя таблицы)", которое возвращает последние идентификационные данные, вставленные для определенной таблицы.

9
ответ дан 3 December 2019 в 13:28
поделиться

Существует три способа получить последние идентификационные данные в sql.

Они были уже упомянуты другими, но для полноты:

  • @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ - могут также возвратиться, идентификаторы, созданные в других объектах в том же объеме (думайте триггеры),
  • IDENT_CURRENT - ограниченный таблицей, но не Вашим объемом, таким образом, это может дать плохие результаты для занятых таблиц
  • Scope_Idenity () - Ограниченный объемом запроса. Используйте это 99% времени

Кроме того, существует три способа взять тот идентификатор и возвратить его Вашему клиентскому коду:

  • Используйте выходной параметр в хранимой процедуре

    INSERT INTO [MyTable] ([col1],[col2],[col3]) VALUES (1,2,3); 
    SELECT @OutputParameterName = Scope_Identity();
    
  • Используйте возвращаемое значение.

    INSERT INTO [MyTable] ([col1],[col2],[col3]) VALUES (1,2,3); 
    Return Scope_Identity();
    
  • Выберите идентификатор в набор результатов. Например, Ваш sql оператор выглядел бы примерно так:

    Dim ResultID As Integer
    Dim strSQL As String
    strSQL = "INSERT INTO [MyTable] ([col1],[col2],[col3]) VALUES (1,2,3); SELECT Scope_Identity();"
    rsResults.Open strSQL, oConn
    ResultID = rsResults("ID")
    

К сожалению (или к счастью, с моей точки зрения) мой Классик ASP это слишком далеко уведенный для показа примеров первых двух из клиентского кода.

9
ответ дан 3 December 2019 в 13:28
поделиться

Я всегда задавался вопросом, почему можно было бы когда-либо хотеть использовать

@@identity

с тех пор

select scope_identity() 

очевидно, большинство, сохраняют способ выполнить то, что просит Scot.

1
ответ дан 3 December 2019 в 13:28
поделиться

ВЫБЕРИТЕ @@ Идентификационные данные или ВЫБЕРИТЕ SCOPE_IDENTITY (), обе работы, однако Выбирающие SCOPE_Identity (), более безопасны, потому что это возвращает последний автоматический сгенерированный идентификатор в Вашей текущей области. Так, например, предположите, что у нас есть таблица под названием ScopeIDTable, и на этой таблице у нас есть триггер. Этот триггер вставит в запись в TriggerIdTable, обе таблицы имеют столбец автоприращения.

При использовании ВЫБОРА @@ Идентификационные данные, Вы получите последний автоматический инкремент на той сессии, которая была бы идентификатором, сгенерированным из триггера (TriggerIdTable).

При использовании ИЗБРАННОГО SCOPE_IDENTITY (), Вы получите идентификатор от своего ScopeIdTable.

3
ответ дан 3 December 2019 в 13:28
поделиться

Где нескольким записям нужно к вставленному сразу в основанный на наборе вид, это может стать более интересным.

Я иногда использовал сгенерированную сторону клиента GUID (но для классического ASP необходимо будет, вероятно, использовать утилиту для генерации значений), или, чаще, NEWSQUENTIALID () ограничение на столбец ключа GUID в конце сервера.

Я знаю не все как GIUDS, хотя, по некоторым довольно допустимым причинам (их размер и как он влияет на индексацию/подкачку страниц для одной).

http://www.sqlmag.com/Articles/Index.cfm?ArticleID=50164&pg=2

0
ответ дан 3 December 2019 в 13:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: