Question

Dans le contexte de SQL Server 2005, j'ai une table pour laquelle la clé primaire est un identificateur unique (GUID), avec une valeur par défaut générée par la fonction newid (). Je veux écrire une procédure stockée qui insère un nouvel enregistrement dans la table. Comment puis-je obtenir la valeur PK de l'enregistrement? c'est facile pour un champ déclaré, j'appelle scope_identity (). Comment dois-je procéder avec les guides?

Merci, Lucian

Était-ce utile?

La solution

Je générerais un nouveau Guid avant d'insérer l'enregistrement et utiliserais explicitement ce nouveau Guid en tant que PC pour l'enregistrement. Vous utilisez ensuite ce guid après l'insertion, sachant qu'il fait référence à la ligne que vous venez d'insérer, par exemple.

DECLARE @newGuid uniqueidentifier
SET @newGuid = newid()

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

SELECT * FROM myTable
WHERE id = @newGuid

Autres conseils

La génération du GUID avant insertion introduit la fragmentation d'index.

Il n'est pas nécessaire de déclarer le GUID avant insertion,

Je recommanderais:

  1. Utilisation de la contrainte NEWSEQUENTIALID par défaut pour générer des guids contigus. (cela éliminera la fragmentation d'index - un problème bien connu avec les guids comme clé primaire).

  2. Utilisez la nouvelle clause OUTPUT (nouvelle dans SQL Server 2005) qui vous permettra d’obtenir le GUID inséré récemment.

Exemple ci-dessous:

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

Vous devrez créer l'identificateur unique dans la procédure stockée et l'insérer dans la table, puis renvoyer la valeur une fois l'insertion terminée.

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

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

Il utilisera simplement la valeur insérée au lieu de créer un nouveau guid comme valeur par défaut.

Vous pouvez la renvoyer sous forme de ligne à l'aide de l'instruction SELECT ou du paramètre OUTPUT s'il s'agit d'une ligne à la fois.

Si vous êtes déjà dans une procédure stockée, vous pouvez récupérer le newid (), effectuer l'insertion et renvoyer le guid:

CREATE PROCEDURE Insert_myTable(@values...) AS

DECLARE @pk GUID
SET @pk = NEWID()

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

SELECT @pk

Pour les requêtes:

si votre colonne de clé primaire est la première colonne Utilisez executescalar () pour l'exécution de votre instruction d'insertion ...

il renverra la première colonne de la première ligne du jeu de résultats renvoyé par la requête.

Pour la procédure: INSERT INTO tblBrowser (IDString) VALEURS (@IDString) SET @ID = @@ Identity déclarer un paramater ado spécifiquement en tant que paramètre de retour et il recevra la valeur renvoyée par le sproc Définissez par = .CreateParameter ("intOutput", adVarChar, adParamOutput, 30).

Avec un tableau du type:

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]

Et une insertion SQL comme:

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

Vous obtiendrez le NOUVEAU GUID en sortie:

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

Utilisez ceci qui fonctionne pour moi

  DECLARE @id uniqueidentifier;
  SELECT @id=NEWID()    
  INSERT INTO MyTable(ID,other)
  VALUES(@id,'other');
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top