ottenere nuovi SQL ID del record

Come posso ottenere indietro generata automaticamente l’ID per un nuovo disco che ho appena inserito?
(Con ASP classico e MSSQL 2005)

  • grazie a tutti che hanno suggerito SELEZIONARE SCOPE_IDENTITY(). Sono stato in grado di creare una stored procedure: SET ANSI_NULLS SU ” GO SET QUOTED_IDENTIFIER GO ALTER PROCEDURE [dbo].[giri] (@N varchar(30), INIZIARE la TRANSAZIONE Ins INSERIRE IN UN (n) VALUES (@N) SELEZIONARE NewID = SCOPE_IDENTITY()
  • ‘utilizzo di VB ho chiamato la sp:<br> Set cn = Server.CreateObject(“ADODB.Connessione”) connectString = “DSN” cn.Aprire connectString, “utente”, “PW0rd” Set rs = Server.CreateObject(“ADODB.Recordset”) set rs = cn.Execute(“EXEC [DB].[dbo].[A] @Str=” & str)<br> il ritorno al valore:<br> resultID = rs(0)
InformationsquelleAutor Keith | 2009-02-26

 

8 Replies
  1. 25
    SELECT SCOPE_IDENTITY() 

    usando @@IDENTITY può avere risultati imprevisti, in modo da essere attenti a come si usa quella. Trigger per inserire record per le altre tabelle in causa il valore di @@IDENTITY per cambiare, dove SCOPE_IDENTITY() vi darà l’ultima identità da solo i tuoi ambito.

    Ecco un esempio che mostra la differenza tra @@IDENTITY e SCOPE_INSERT() e come possono restituire valori diversi..

    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

    Un’altra opzione che nessuno ha discusso qui di seguito, utilizzare la clausola OUTPUT che è in SQL 2005. In questo caso, devi solo aggiungere la clausola output per l’inserimento, e poi prendere il recordset dal codice. Questo funziona bene quando l’inserimento di più record invece di solo 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;
  2. 9

    SELECT @@IDENTITY di solito funziona, ma potrebbe restituire l’identità di un record inserito a causa di un trigger o qualcosa del genere, e non l’originale.

    SELEZIONARE SCOPE_IDENTITY è quello che mi consiglia. Restituisce i valori inseriti solo nell’ambito della corrente.

    C’è anche un “IDENT_CURRENT(nometabella)” che restituisce l’ultimo di identità inserito una tabella specifica.

  3. 9

    Ci sono tre modi per ottenere i ultimi identità in sql.

    Erano già indicato da altri, ma per completezza:

    • @@IDENTITY – può anche tornare id creato da altri oggetti nello stesso ambito (si pensi trigger)
    • IDENT_CURRENT limitata a un tavolo, ma non alla tua portata, in modo da può dare cattivi risultati per occupato tabelle
    • Scope_Idenity() – Limitato all’ambito della richiesta. Utilizzare questo 99% del tempo

    Inoltre, ci sono tre modi per prendere l’ID e tornare per il tuo codice cliente:

    • Utilizzare un parametro di output in una stored procedure

      INSERT INTO [MyTable] ([col1],[col2],[col3]) VALUES (1,2,3); 
      SELECT @OutputParameterName = Scope_Identity();
    • Utilizzare un valore di ritorno.

      INSERT INTO [MyTable] ([col1],[col2],[col3]) VALUES (1,2,3); 
      Return Scope_Identity();
    • Selezionare l’id in un set di risultati. Per esempio, l’istruzione sql sarebbe simile a questa:

      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")

    Purtroppo (o per fortuna, dal mio punto di vista) il mio Classic ASP è troppo lontano andato per mostrare esempi dei primi due dal codice client.

  4. 3

    SELECT @@Identity o SELEZIONA SCOPE_IDENTITY() sia il lavoro, tuttavia, la Selezione di SCOPE_Identity() è più sicuro, perché restituisce l’ultimo generata automaticamente l’ID nel campo di applicazione. Così, per esempio, supponiamo di avere una tabella denominata ScopeIDTable e su questo tavolo si dispone di un trigger. Questo pulsante per inserire un record in TriggerIdTable entrambe le tabelle hanno un incremento automatico di colonna.

    Se si utilizza SELECT @@Identity vi saranno mostrati anche l’ultimo incremento automatico in quella sessione che sarebbe l’Id generato dal trigger (TriggerIdTable).

    Se si utilizza SELEZIONARE SCOPE_IDENTITY() si ottiene l’id dal ScopeIdTable.

  5. 1

    Si esegue la query

    select scope_identity()

    utilizzando la stessa connessione al database, prima di fare qualsiasi cosa con esso. Il risultato è, come ci si aspetterebbe probabilmente, un set di record che contengono una sola riga che ha un singolo campo. È possibile accedere campo con indice 0, o si può dare un nome, se si preferisce che:

    select scope_identity() as lastId
  6. 1

    Mi sono sempre chiesto perché si sarebbe mai desidera utilizzare

    @@identity

    dal

    select scope_identity() 

    ovviamente, è il più salvare il modo per realizzare quello Scozzese sta chiedendo.

  7. 0

    In cui più di record inseriti in una volta in un set di moda, si può ottenere più interessanti.

    Talvolta ho utilizzato Guid generato clientside (ma per ASP classico, si sarebbe probabilmente bisogno di utilizzare un programma di utilità per generare i valori) o, più spesso, un NEWSQUENTIALID() vincolo di chiave GUID colonna, alla fine del server.

    Sono consapevole che non tutti sono come GIUDS anche se, per alcuni molto validi motivi (la loro dimensione e come influisce di indicizzazione/paging per uno).

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

  8. 0

    Grazie a tutti che hanno suggerito SELEZIONARE SCOPE_IDENTITY(). Sono stato in grado di creare una stored procedure:

    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

    e chiamare la stored procedure utilizzando 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)

    Ora posso usare resultID in qualsiasi momento, mi riferisco al creato di recente, ID.

Lascia un commento