Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/02/2012, 11h15   #1
Membre du Club
 
Homme
Inscription : juin 2010
Messages : 91
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2010
Messages : 91
Points : 44
Points : 44
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 :
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 :
Citation:
Operand type clash: int is incompatible with uniqueidentifier
comment faire ?
kevindeta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 11h56   #2
Membre du Club
 
Inscription : juin 2007
Messages : 115
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 115
Points : 41
Points : 41
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 ?
azur668 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 13h18   #3
Membre du Club
 
Homme
Inscription : juin 2010
Messages : 91
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2010
Messages : 91
Points : 44
Points : 44
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
kevindeta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 15h45   #4
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 674
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 674
Points : 8 741
Points : 8 741
Bonjour,

Citation:
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 :
DEFAULT (CAST(CAST(0 AS BINARY) AS uniqueidentifier))
ou encore :

Code :
DEFAULT (CAST('00000000-0000-0000-0000-000000000000' AS uniqueidentifier))
@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/02/2012, 09h50   #5
Membre du Club
 
Homme
Inscription : juin 2010
Messages : 91
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2010
Messages : 91
Points : 44
Points : 44
Merci beaucoup elsuket ! ça m'a bien aidé !

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

j'ai ça :

Code :
[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 :
[dbo].[Eerror].[ErrorID] = CAST(CAST(SCOPE_IDENTITY()AS BINARY)AS uniqueidentifier);
Merci de me répondre
kevindeta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2012, 11h29   #6
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 674
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 674
Points : 8 741
Points : 8 741
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 :
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 :
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
@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2012, 11h46   #7
Membre du Club
 
Homme
Inscription : juin 2010
Messages : 91
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2010
Messages : 91
Points : 44
Points : 44
Merci il faut que je modifie pas mal de truc dans ce cas !
kevindeta est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h28.


 
 
 
 
Partenaires

Hébergement Web