Recupera il valore chiave dell'identificatore univoco per un record
-
19-08-2019 - |
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
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:
-
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).
-
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');