Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
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 01/03/2011, 08h00   #1
Membre du Club
 
Inscription : février 2008
Messages : 246
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 246
Points : 42
Points : 42
Par défaut Comparer données colonnes de type Text

Bonjour tout le monde, J'ai crée une requête pour comparer les données de 2 colonne ayant le même type Text (Il s'agit en fait de la même structure de la base et juste les données sont modifiées).
La requête que j'ai utilisée est
Code :
1
2
3
4
SELECT t1.SPADM_SP_CODE_FK_PK, t1.SPADM_LIBELLE, t2.SPADM_SP_CODE_FK_PK,t2.SPADM_LIBELLE
FROM THERIAQUE_DEST.theriaque.SPADM_SPECIALITE_MODEADM  t1
INNER JOIN THERIAQUE_MAJ.theriaque.SPADM_SPECIALITE_MODEADM  t2 ON t1.SPADM_SP_CODE_FK_PK = t2.SPADM_SP_CODE_FK_PK
WHERE cast(t1.SPADM_LIBELLE AS varchar(max)) <> cast(t2.SPADM_LIBELLE AS varchar(max))
Normalement je dois avoir une différence car pour le même enregistrement la colonne "Libelle" de la 1ère base contient (350 mg/m²) et la seconde colonne contient (350 mg/m2).
Est ce que quelqu'un pourrait m'éclaircir cette situation et m'aide à résoudre ce problème.
Merci d'avance pour votre collaboration
mercure07 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 09h29   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 950
Points : 17 769
Points : 17 769
Normal les types LOB comme Text, Ntext et IMAGE ne sont pas relationnel. Donc certaines opérations sont impossibles.

évitez de stocker des données que vous voulez manipuler sur le plan relationnel dans de telles colonnes.

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 09h51   #3
Membre du Club
 
Inscription : février 2008
Messages : 246
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 246
Points : 42
Points : 42
Merci pour votre réponse.
Mais je n'ai pas le choix car il s'agit d'une base de données client et je dois détecter les mises à jour effectuées entre 2 bases.
De plus, la même requête m'affiche d'autres différences entre plusieurs enregistrements mais pas cet enregistrement qui contient malgré tout une différence.
mercure07 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 10h44   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 950
Points : 17 769
Points : 17 769
Cela dépend à quel offset de la ligne se situe la différence.

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 11h21   #5
Membre Expert
 
Homme
Développeur java, access, sql server
Inscription : octobre 2005
Messages : 851
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Développeur java, access, sql server
Secteur : Industrie

Informations forums :
Inscription : octobre 2005
Messages : 851
Points : 1 302
Points : 1 302
Comme on ne peut pas utiliser CHECKSUM sur des champs Text,
une possibilité est de créer une fonction utilisateur qui compare ces deux champs.

Du genre :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
CREATE FUNCTION [dbo].[CompText] (@Text1 Text, @Text2 Text)  
RETURNS varchar(2) AS  
BEGIN 
 
DECLARE @R varchar(2)
 
	SET @R = 'OK'
	IF SUBSTRING(@Text1,1,8000) <> SUBSTRING(@Text2,1,8000) SET @R='KO'
 
 
RETURN (@R)
 
END
Cette fonction est à utiliser dans la requête et retourne 'OK' si les chaînes sont identiques ou 'KO' s'il existe une différence.
Code :
SELECT  dbo.CompText(t1.SPADM_LIBELLE, t2.SPADM_LIBELLE) AS test FROM ...
Il faut naturellement étendre cette fonction pour les textes dépassants 8000 caractères (faire un boucle par exemple)
__________________
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser.
First, make it work. Then, make it fast. Finally, make it user-friendly.
Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich.
Népomucène est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 12h02   #6
Membre du Club
 
Inscription : février 2008
Messages : 246
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 246
Points : 42
Points : 42
Merci pour ta participation, mais cette fonction compare juste la longueur du texte mais moi je veux comparer les données elles même.
mercure07 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 12h09   #7
Membre Expert
 
Homme
Développeur java, access, sql server
Inscription : octobre 2005
Messages : 851
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Développeur java, access, sql server
Secteur : Industrie

Informations forums :
Inscription : octobre 2005
Messages : 851
Points : 1 302
Points : 1 302
Pas du tout.
La fonction compare les deux textes et signale s'il existe une différence.
Code :
IF SUBSTRING(@Text1,1,8000) <> SUBSTRING(@Text2,1,8000) ...
__________________
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser.
First, make it work. Then, make it fast. Finally, make it user-friendly.
Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich.
Népomucène est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 12h10   #8
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 950
Points : 17 769
Points : 17 769
Non, elle compare le contenu des 8000 premiers caractères....

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 12h10   #9
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par mercure07 Voir le message
Merci pour ta participation, mais cette fonction compare juste la longueur du texte mais moi je veux comparer les données elles même.
A mon sens, cette fonction compare les 8000 premiers caractères de deux variables de type text... pas leur longueur, mais bien leur valeur...

ce que te disais Népomucène, c'est que si tu veux comparer au delà de 8000 caractères, il faudra faire une boucle, pour comparer 8000 par 8000 sur toute la longueur voulue...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 12h14   #10
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
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 667
Points : 8 715
Points : 8 715
Bonjour,

Non, la fonction que vous a donné Népomucène compare bien les données.

Si vous êtes sous SQL Server 2005 ou plus, vous pouvez transtyper ces deux colonnes au type varchar(max) ...

@++
__________________
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 01/03/2011, 16h09   #11
Membre du Club
 
Inscription : février 2008
Messages : 246
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 246
Points : 42
Points : 42
Merci tout le monde pour vos réponses.
En fait, j'ai déjà fait dans ma requête :
Code :
1
2
3
4
SELECT t1.SPADM_SP_CODE_FK_PK, t1.SPADM_LIBELLE, t2.SPADM_SP_CODE_FK_PK,t2.SPADM_LIBELLE
FROM THERIAQUE_DEST.theriaque.SPADM_SPECIALITE_MODEADM  t1
INNER JOIN THERIAQUE_MAJ.theriaque.SPADM_SPECIALITE_MODEADM  t2 ON t1.SPADM_SP_CODE_FK_PK = t2.SPADM_SP_CODE_FK_PK
WHERE cast(t1.SPADM_LIBELLE AS varchar(max)) <> cast(t2.SPADM_LIBELLE AS varchar(max))
Ou vous voulez dire que je fasse le cast dans la
Code :
IF SUBSTRING(@Text1,1,8000) <> SUBSTRING(@Text2,1,8000)
Si oui, alors comment faire.
Merci encore pour votre apport
mercure07 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 16h35   #12
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Arff,

non effectivement, tel que vous le faites dans votre premier post, c'est correct

Vous avez en fait je pense un problème de collation.

est-ce que ceci vous donne le resultat que vous attendez ?

Code SQL :
1
2
3
4
5
 
SELECT t1.SPADM_SP_CODE_FK_PK, t1.SPADM_LIBELLE, t2.SPADM_SP_CODE_FK_PK,t2.SPADM_LIBELLE
FROM THERIAQUE_DEST.theriaque.SPADM_SPECIALITE_MODEADM  t1
INNER JOIN THERIAQUE_MAJ.theriaque.SPADM_SPECIALITE_MODEADM  t2 ON t1.SPADM_SP_CODE_FK_PK = t2.SPADM_SP_CODE_FK_PK
WHERE cast(t1.SPADM_LIBELLE AS varchar(max)) <> cast(t2.SPADM_LIBELLE AS varchar(max)) COLLATE FRENCH_CS_AS
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 15h48   #13
Membre du Club
 
Inscription : février 2008
Messages : 246
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 246
Points : 42
Points : 42
Merci pour tous.
C'est résolu avec le COLLATE.
mercure07 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 14h33.


 
 
 
 
Partenaires

Hébergement Web