2017-10-17 30 views
0

Je possède ce tableau:Comment utiliser NEWID()/NEWSEQUENTIALID() par défaut avec Guid/uniqueidentifier?

CREATE TABLE [dbo].[SandTable](
    [Id] [uniqueidentifier] NOT NULL, 
    [Date] [date]    NULL, 
    CONSTRAINT [PK_SandTable] PRIMARY KEY) 

ALTER TABLE [dbo].[SandTable] ADD CONSTRAINT [DF_SandTable_Id] DEFAULT (NEWID()) FOR [Id] 

question n'est pas sur l'utilisation NEWID() vs NEWSEQUENTIALID(). J'utilise linqPad pour tester la table.

SandTables.InsertOnSubmit(new SandTable 
{ 
    // I don't provide any value for Id 
    Date = DateTime.Now 
}); 
SubmitChanges(); 

Mon idée initiale était de créer une colonne Id qui est capable de s'initialiser à une valeur quand aucune est fournie, mais utilisera l'ID fourni quand on est fourni.

Mais comme Guid est une structure, et non une classe, l'Id n'est jamais nul, Id est initialisé à sa valeur par défaut (00000000-0000-0000-0000-000000000000). Le serveur SQL considère donc que l'ID a toujours une valeur et que l'instruction par défaut NEWID() n'est jamais appelée.

Est-il possible de forcer l'appel à NEWID() sur une valeur spécifique? Dois-je utiliser un déclencheur pour évaluer la valeur de Id et quand c'est (00000000-0000-0000-0000-000000000000) alors appelez NEWID()? Quelles sont les solutions ou solution de contournement?

+0

Voici une question similaire, intéressant, mais ne répond pas à ma question: Peut-être un https://stackoverflow.com/q/11974939/196526 –

+0

question stupide mais si vous savez que vous allez insérer - pourquoi ne pas créer le GUID dans votre code avec id = Guid.NewGuid()? Parce que vous voulez que SQL le crée? –

+0

Vous utilisez également une procédure stockée pour l'insertion d'une option? Ensuite, vous pouvez simplement vérifier si le guid était vide et en générer un nouveau si c'est le cas et effectuer l'insertion. –

Répondre

1

Vous pouvez le faire avec une contrainte de vérification:

ALTER TABLE [dbo].[SandTable] 
    ADD CONSTRAINT [DF_SandTable_Id] DEFAULT (NEWID()) FOR [Id] 

ALTER TABLE [dbo].[SandTable] 
    WITH CHECK ADD CONSTRAINT [CK_SandTable_Id_Empty] 
    CHECK (
     [Id] <> CAST(0x0 AS UNIQUEIDENTIFIER) 
    ) 
+0

Je crois que la contrainte Check est utilisée pour vérifier l'entrée entrante. Pouvez-vous élaborer sur cette ligne: '[Id] <> CAST (0x0 AS UNIQUEIDENTIFIER)' –

+0

Cela bloquerait l'insertion, je crois qu'il veut simplement générer NewID() SI l'ID passé est 0x0 (je pourrais être faux). –

+0

J'ai mal compris la question. Je vais mettre à jour avec une nouvelle réponse sous peu. –