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 21/12/2010, 09h39   #1
Nouveau Membre du Club
 
Inscription : mai 2006
Messages : 83
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 83
Points : 34
Points : 34
Par défaut [SQL Server 2005]Requête et bcp avec des timestamp

Bonjour à tous,

Je souhaite utiliser le type timestamp pour pouvoir récupérer uniquement les données mises à jour d'une table.
Je procède ainsi :
1. Je récupère en BCP out les données d'une table dans un fichier csv
2. J'insère ces données dans une table en BCP in

Les données récupérées dans le fichier csv sont le résultat d'une requête qui doit se baser sur la colonne timestamp.
Pour être plus claire :

Requête sur A (utilisant timestamp) donne un résultat (données mises à jour) dans une table B ==> bcp out sur cette table ==> bcp in vers la table cible C

La table B est une sous-table de A; la table C est la copie de B.

J'ai déclaré une colonne de type timestamp dans la table C, le type de la table source étant aussi de type timestamp.

Je rencontre cependant deux problèmes :
1. Au niveau du BCP out, la valeur du timestamp se retrouve bien dans le fichier csv. Mais au moment d'être copié dans la table C en bcp in, la valeur n'est plus la même. Enfin, je crois...
Par exemple : le timestamp a la valeur 000000000494A9F9 dans A (puis dans B, puis dans le fichier) mais après le bcp in, quand je refresh la table C, la valeur du timestamp est devenu 0x000000000486A27A
2. Comment requêter sur une colonne de type timestamp pour ne récupérer que les enregistrements modifiés? Au départ, je voulais stocker la plus grande valeur du timestamp dans C puis faire une requête du style :

Code :
SELECT * INTO B FROM A WHERE colonne_timestamp > max_timestamp_C
Mais vu que la valeur insérée dans C est différente de celle de A, je ne vois plus trop comment m'y prendre.

Remarques complémentaires :
- les tables A, B et C sont toutes trois dans des bases différentes sur des serveurs différents.
- je ne peux pas modifier le mode opératoire décrit ci-dessus
- quand je parle de timestamp, je parle du type timestamp d'sql server (binary).

Une idée?
merci d'avance!
tinwul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2010, 10h12   #2
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Bonjour,

Pourrait t'on avoir la DDL de vos tables concernes ?
Les serveurs sont ils tous des serveurs SQL Server ?
Question bete mais pourquoi passez vous par une table intermediaire pour mettre a jour vos donnees ?

A -> B -> C equivalent a A -> C en principe ..

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2010, 10h31   #3
Nouveau Membre du Club
 
Inscription : mai 2006
Messages : 83
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 83
Points : 34
Points : 34
Citation:
Envoyé par mikedavem Voir le message
Bonjour,

Pourrait t'on avoir la DDL de vos tables concernes ?
Les serveurs sont ils tous des serveurs SQL Server ?
Question bete mais pourquoi passez vous par une table intermediaire pour mettre a jour vos donnees ?

A -> B -> C equivalent a A -> C en principe ..

++
1. DDL la structure de mes tables, je suppose? elles sont toutes trois identiques : un id de type int, une colonne de type timestamp, des libellés de type varchar(), rien d'extravagant...

2. oui, les serveurs sont tous des SQL Server 2005

3. la question n'est pas bête, elle est même logique, c'est pourquoi j'ai précisé que je ne pouvais pas modifier le mode opératoire. En fait, je n'ai pas d'accès direct à la table A. Le seul moyen d'y accéder est via un bcp out. Et pour tout récupérer dans une table, je fais l'inverse, un bcp in.

Je me suis peut être plantée sur le DDL, je ne vois pas vraiment ce que ça signifie.
tinwul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2010, 16h57   #4
Nouveau Membre du Club
 
Inscription : mai 2006
Messages : 83
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 83
Points : 34
Points : 34
J'ai finalement trouvé la solution!

* Pour le problème n°1
Mon erreur était là :
Citation:
J'ai déclaré une colonne de type timestamp dans la table C, le type de la table source étant aussi de type timestamp.
Le type timestamp d'SQL server est un binary(8) . Il faut donc déclarer la colonne cible en tant que binary(8) et non en tant que timestamp, sinon elle se conduit comme un timestamp (insertion via bcp = modification = changement de la valeur timestamp)!

* Pour le problème n°2
Citation:
2. Comment requêter sur une colonne de type timestamp pour ne récupérer que les enregistrements modifiés? Au départ, je voulais stocker la plus grande valeur du timestamp dans C puis faire une requête du style :

Code :
SELECT * INTO B FROM A WHERE colonne_timestamp > max_timestamp_C
Mais vu que la valeur insérée dans C est différente de celle de A, je ne vois plus trop comment m'y prendre.
Cette solution fonctionne très bien, une fois que l'on a réglé le problème n°1 !

Merci de m'avoir au moins lu, j'imagine que personne n'avait la réponse
tinwul 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 06h27.


 
 
 
 
Partenaires

Hébergement Web