IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

int is incompatible with uniqueidentifier !


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 97
    Par défaut int is incompatible with uniqueidentifier !
    boujour,

    j'ai voulu changer quelques fichiers .sql pour modifier la création d'une base de donnée et je veux des champs uniqueidentifier dans ma table.

    voici le code de la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TABLE [dbo].[maTable] (
    [champ1] [Int] NOT NULL ,
    [champUniqueID] [uniqueidentifier] NOT NULL  CONSTRAINT [DF__AutreTable_champUniqueID] DEFAULT (0),
    [champUniqueID_2][uniqueidentifier] NOT NULL ,
    ON [PRIMARY]
     
    GO
    avec sa je me retrouve avec l'erreur :
    Operand type clash: int is incompatible with uniqueidentifier
    comment faire ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 140
    Par défaut
    C'est la valeur par défaut qui pose problème :
    0 est de type int, or il est Impossible de convertir un int en uniqueidentifier.
    peut etre DEFAULT (NEWID()) peut convenir ?
    Ou bien autoriser les NULL ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 97
    Par défaut
    Ok en attendant j'ai mit :

    et cela ne me retourne pas d'erreur pour le moment mais je ne sait pas les conséquences du ' ' par la suite.

    Le NEWID() je sais pas comment sa fonctionne si sa recréér un id différent a chaque fois alors que l'on a des contraintes entre les champs uniqueidentifier je sent l'erreur d'avance mais bon je pourrai tester sa plus tard, sait-on jamais.

    Merci

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Le NEWID() je sais pas comment sa fonctionne si sa recréér un id différent a chaque fois alors que l'on a des contraintes entre les champs uniqueidentifier
    Si vous faites un INSERT avec un SELECT NEWID(), non.
    Si vous faites un UPDATE avec un SET maColonne = NEWID(), oui.
    Il existe aussi la fonction SELECT NEWSEQUENTIALID(), mais vous ne pouvez l'utiliser que dans une contrainte DEFAULT.

    En ce qui concerne la votre, vous pouvez écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DEFAULT (CAST(CAST(0 AS binary) AS uniqueidentifier))
    ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DEFAULT (CAST('00000000-0000-0000-0000-000000000000' AS uniqueidentifier))
    @++

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 97
    Par défaut
    Merci beaucoup elsuket ! ça m'a bien aidé !

    J'aurais une toute dernière question avant de clore ce sujet :

    j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [dbo].[Eerror].[ErrorID] = SCOPE_IDENTITY();
    Mais j'ai le problème suivant, ErrorID est un unique identifier, j'ai essayer de le CAST mais je ne sait pas si je peux faire pareil que ton exemple, c'est a dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [dbo].[Eerror].[ErrorID] = CAST(CAST(SCOPE_IDENTITY()AS BINARY)AS uniqueidentifier);
    Merci de me répondre

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Comme vous le lirez, SCOPE_IDENTITY() Renvoie la dernière valeur d'identité insérée dans une colonne d'identité.
    Or seules les colonnes de type entier (tinyint, smallint, int et bigint) peuvent avoir cette propriété, et il ne peut y en avoir qu'une seule par table.
    En conséquence, une colonne de type UNIQUEIDENTIFIER ne peut pas retourner une telle valeur.

    Notez que le type uniqueidentifier est un très mauvais choix pour une clé primaire.

    Donc à l'INSERT, si vous voulez récupérer la valeur, vous ne pouvez faire que comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DECLARE @uid uniqueidentifier = NEWID()
     
    INSERT	INTO dbo.maTable
    (
    	colonnes
    	, uniqueidentifier_colonne
    	, autres_colonnes
    )
    SELECT	@desColonnes
    	, @uid
    	, @encore_autre_colonnes
    FROM	...
     
    SELECT @uid
    Mais cela ne fonctionne que pour une seule ligne.

    Pour plusieurs lignes, vous devez écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    DECLARE @uid_table TABLE
    (
    	uniqueidentifier_colonne uniqueidentifier
    )
     
    INSERT	INTO dbo.maTable
    (
    	colonnes
    	, uniqueidentifier_colonne
    	, autres_colonnes
    )
    OUTPUT	INSERTED.uniqueidentifier_colonne INTO @uid_table
    SELECT	desColonnes
    	, @uid
    	, encore_autre_colonnes
    FROM	...
     
    SELECT	uniqueidentifier_colonne
    FROM	@uid_table
    @++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ljava.lang.Object; incompatible with ma.eai.batch.ovo.util.Compte
    Par samiamiya dans le forum Général Java
    Réponses: 2
    Dernier message: 20/07/2012, 11h49
  2. Réponses: 4
    Dernier message: 25/11/2010, 09h41
  3. Réponses: 4
    Dernier message: 16/02/2010, 12h05
  4. Réponses: 2
    Dernier message: 17/10/2007, 13h07
  5. The return type is incompatible with..
    Par lr dans le forum Langage
    Réponses: 6
    Dernier message: 12/11/2006, 22h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo