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

MS SQL Server Discussion :

[SQL Server 2005]Requête et bcp avec des timestamp


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 83
    Points : 60
    Points
    60
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    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 ..

    ++

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 83
    Points : 60
    Points
    60
    Par défaut
    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.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 83
    Points : 60
    Points
    60
    Par défaut
    J'ai finalement trouvé la solution!

    * Pour le problème n°1
    Mon erreur était là :
    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

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

Discussions similaires

  1. [vista,VB 2005,SQL server 2005]requêtes paramétrées avec mysql
    Par olivier57b dans le forum Accès aux données
    Réponses: 4
    Dernier message: 04/09/2008, 18h58
  2. SQL Server 2005 - ETL - Insertion données avec vérification.
    Par Mailgifson dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/12/2007, 12h22
  3. Réponses: 3
    Dernier message: 04/06/2007, 12h29
  4. Réponses: 4
    Dernier message: 04/05/2006, 19h01
  5. SQL SERVER 2005 -- requête récursive avec bcp données
    Par evans dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 04/05/2006, 19h01

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