Domanda

nel contesto di SQL Server 2005, ho una tabella per cui la chiave primaria è un uniqueidentifier (GUID), con un valore predefinito generato dalla funzione newid (). Voglio scrivere una procedura memorizzata che inserisce un nuovo record nella tabella. Come ottengo il valore PK del record? per un campo dichiarato dall'identità, questo è facile - chiamo scope_identity (). Come devo procedere con le guide?

Grazie, Lucian

È stato utile?

Soluzione

Genererei un nuovo Guid prima di inserire il record e utilizzerei esplicitamente questo nuovo Guid come PK per il record. Quindi usi quel guid dopo l'inserimento, sapendo che si riferisce alla riga che hai appena inserito, ad esempio

DECLARE @newGuid uniqueidentifier
SET @newGuid = newid()

INSERT INTO myTable(id, stringval)
VALUES (@newGuid, "Hello")

SELECT * FROM myTable
WHERE id = @newGuid

Altri suggerimenti

La generazione di GUID prima dell'inserimento introduce la frammentazione dell'indice.

Non è necessario dichiarare il GUID prima dell'inserimento,

Vorrei raccomandare:

  1. Utilizzo del vincolo predefinito NEWSEQUENTIALID per generare guide contigue. (questo eliminerà la frammentazione dell'indice - un problema ben noto con le Guide come chiave primaria).

  2. Usa la nuova clausola OUTPUT (nuova in SQL Server 2005) che ti permetterà di ottenere un nuovo GUID inserito.

Esempio seguente:

DECLARE @outputTblCustomer1 TABLE (CustomerID uniqueidentifier)

-- Customer1  

INSERT INTO dbo.Customer1 (CustomerNumber, LastName) OUTPUT INSERTED.CustomerID INTO @outputTblCustomer1 VALUES (-1, N'LastName')  

SELECT CustomerID FROM @outputTblCustomer1

-- Customer3 

INSERT INTO dbo.Customer3 (CustomerNumber, LastName) VALUES (-1, N'LastName')  

SELECT SCOPE_IDENTITY() AS CustomerID

Dovrai creare l'identificatore univoco nella procedura memorizzata e inserirlo nella tabella, quindi restituire il valore al termine dell'inserimento.

CREATE PROCEDURE insNewGuidIdRow 
    @newId  UNIQUEIDENTIFIER output,
    @otherData  NVARCHAR(10)
AS
BEGIN
    SET @newId = NEWID()

    INSERT INTO GuidIdTable(id, otherData)
    VALUES (@newId, @otherData)
END

Utilizzerà semplicemente il valore inserito invece di creare una nuova guida come valore predefinito.

Puoi restituirlo come riga usando l'istruzione SELECT o il parametro OUTPUT se è una riga alla volta.

Se si è già in una procedura memorizzata, è possibile recuperare il newid (), eseguire l'inserimento e restituire il guid:

CREATE PROCEDURE Insert_myTable(@values...) AS

DECLARE @pk GUID
SET @pk = NEWID()

INSERT INTO myTable(PKID, values...) VALUES (@pk, @values...)

SELECT @pk

Per le query:

se la colonna della chiave primaria è la prima colonna Usa execescalar () per l'esecuzione del tuo insert stmt ...

restituirà la prima colonna della prima riga nel set di risultati restituito dalla query.

Per la procedura: INSERISCI IN tblBrowser (IDString) VALORI (@IDString) SET @ID = @@ Identity dichiarare un parametro ado specificatamente come un restituisce il parametro e riceverà il valore restituito dallo sproc Imposta par = .CreateParameter (" intOutput " ;, adVarChar, adParamOutput, 30).

Con una tabella come:

CREATE TABLE [dbo].[TableName ](
    [Code] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
    [Name] [nvarchar](100) NOT NULL)

ALTER TABLE [dbo].[TableName ] ADD  CONSTRAINT [DF_Questionnaire_Code]  DEFAULT (newid()) FOR [Code]

E un inserimento come SQL:

INSERT INTO TableName (Name)
OUTPUT  Inserted.Code AS NewGUID
VALUES  ('TEST')

Otterrai il NUOVO GUID come output:

NewGUID
------------------------------------
F540C0F8-ADBC-4054-BAB6-1927DE59FA99

Usa questo che funziona per me

  DECLARE @id uniqueidentifier;
  SELECT @id=NEWID()    
  INSERT INTO MyTable(ID,other)
  VALUES(@id,'other');
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top