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 :

uniqueidentifier et INSERT dans MS-SQL


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 35
    Points : 29
    Points
    29
    Par défaut uniqueidentifier et INSERT dans MS-SQL
    Bonjour,

    j´ai deux tableaux dans ma base de données MS-SQL, contenant chacun une colonne de type uniqueidentifier.

    Je veux copier certaines valeurs de la colonne uniqueidentifier du tableau 1 vers celle du tableau 2. Je fais donc un Select des uniqueidentifier sur le premier puis un insert des uniqueidentifier souhaités dans le second tableau.

    Quand je veux faire le INSERT j´ai un problème, car ce que j´ai récupéré du SELECT, n´est, contrairement à ce que je pensais, pas un uniqueidentifier. Du coup l´insert ne marche pas.

    J´ai essayé de convertir la valeur retournée par le Select en uniqueidentifier, mais en vain.

    Est ce quelqu´un a une idée de ce que je pourrai essayer pour que l´Insert marche ?

    D´avance merci pour votre aide,
    Delphine

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 567
    Points
    19 567
    Billets dans le blog
    25
    Par défaut
    il y a une option set identity insert ON/OFF

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 35
    Points : 29
    Points
    29
    Par défaut
    Merci pour cette piste.

    Malheureusement, je suis relativement novice dans MS-SQL. J´ai cherché dans les tableaux, et je n´ai pas trouvé d´option de ce genre. Quand je le fais exécuter dans mon programme avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mssql_query('SET IDENTITY_INSERT tableau2 ON');
    j´ai l´erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sybase: Server message: The current user is not the database or object owner of table 'tableau2'. Cannot perform SET operation. (severity 16, procedure N/A)
    Comment faut-il faire pour que cette variable soit sur ON :

    D´avance merci.
    Delphine

  4. #4
    Membre actif
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Points : 206
    Points
    206
    Par défaut
    il faut ajouter le nom du proprietaire de la table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SET IDENTITY_INSERT nom_user.tableau2
    il faut chercher nom_user
    A+

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 35
    Points : 29
    Points
    29
    Par défaut
    Le problème est toujours là.

    En faisant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mssql_query('SET IDENTITY_INSERT nom_user.tableau2 ON');
    j´ai l´erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: Sybase: Server message: Table 'nom_user.tableau2' does not have the identity property. Cannot perform SET operation. (severity 16, procedure N/A)
    Et quand je fais mon insertion d´uniqueidentifier dans le tableau 2, avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mssql_query('INSERT INTO tableau2 VALUES (CONVERT(uniqueidentifier, ".$tbl1[id]."))');
    j´ai toujours l´erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: Sybase: Server message: Syntax error converting from a character string to uniqueidentifier. (severity 16, procedure N/A)
    J´ai également essayer sans la convertion (les élèments à insérer étant des uniqueidentifier), et j´ai la même erreur.
    Qu´est ce que je peux encore essayer ?

    Encore merci pour toute l´aide déjà donnée.
    Delphine

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 35
    Points : 29
    Points
    29
    Par défaut
    Dans mon code, j´ai fait le test de mettre directement dans le code de l´INSERT la valeur qui met retournée par le SELECT. Et là ca marche. Mais ca continue à planter si je mets le nom d´une variable.

    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
     
    // Selectionne les uniqueidentifier du tbl1 qui ne sont pas dans tbl2
    $sql = "SELECT id FROM tbl1
            WHERE (id NOT IN
                       (SELECT id
                        FROM tbl2))";
    $result = mssql_query($sql);
     
    while($row = mssql_fetch_array($result))
    {
        // $sql = "INSERT INTO tbl2 (id) VALUES (0xe139157d3689aa4f8fd4074f06f009)";
        // Cette ligne de code fait l´insertion correstement, 0xe139157d3689aa4f8fd4074f06f009 étant une valeur prise par $row[id]
     
        $sql = "INSERT INTO tbl2 (id) VALUES ($row[id])";
        // Cette ligne de code ne fait pas l´insertion correctement, voir le Warning plus bas
     
        mssql_query($sql);
    }
    L´erreur que j´obtiens en effectuant la boucle avec la variable est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: Sybase: Server message: Line 1: Incorrect syntax near '0xf83b5338d6a9b7468dd5024a503fd3'. (severity 15, procedure N/A)
    Y´aurait-il quelqu´un qui peut m´aider ?

    D´avance merci.
    Delphine

  7. #7
    Membre actif
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Points : 206
    Points
    206
    Par défaut
    Cette notion
    $row[id]
    Je la connais pas, tu peux m'expliquer sa signification.

    A+

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 35
    Points : 29
    Points
    29
    Par défaut
    J´écris ma requête:
    $sql = "SELECT id FROM ...";

    Je l´exécute:
    $result = mssql_query($sql);

    Je fais un while sur le résultat obtenu. Je fais donc défiler toutes les lignes du résultat. Et pour que ce soit plus commode, je donne le nom de $row à cette ligne sélectionnée dans le while.
    while($row = mssql_fetch_array($result))

    Et pour récupérer dans mon cas le "id" de chaque ligne, il suffit de faire $row[id].

    Je fais donc défiler avec ma boucle while tous les id de ma requête.

    En fait, je connais surtout le mySQL, je pensais que je pouvais appliquer le même raisonnement en msSQL. :

  9. #9
    Membre actif
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Points : 206
    Points
    206
    Par défaut
    Non sql server ce n'est pas pareil:

    tu devrais passer par un cursor

    un exemple:

    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
    20
    21
    22
    23
    24
    25
    26
     
    DECLARE @au_id varchar(11), @au_fname varchar(20), @au_lname varchar(40)
     
    DECLARE authors_cursor CURSOR FOR 
    SELECT au_id, au_fname, au_lname
    FROM authors
    WHERE state = "UT"
    ORDER BY au_id
     
    OPEN authors_cursor
     
    FETCH NEXT FROM authors_cursor 
    INTO @au_id, @au_fname, @au_lname
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
       "tu fais ton insert "
     
    FETCH NEXT FROM authors_cursor 
    INTO @au_id, @au_fname, @au_lname
     
    end;
     
     
    CLOSE authors_cursor 
    DEALLOCATE authors_cursor
    A+

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 35
    Points : 29
    Points
    29
    Par défaut
    Merci pour le code , malheureusement ca ne marche toujours pas.

    J´ai une erreur comme quoi le constructeur de SQL DECLARE CURSOR n´est pas disponible. Et j´exécute le code directement dans SQL Server.

    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
    20
    DECLARE @id uniqueidentifier(16)
    DECLARE CURSOR id_cursor
    IS
     
    SELECT id
    FROM tbl1
    WHERE (id NOT IN (SELECT id FROM tbl2))
     
    OPEN id_cursor FETCH NEXT
    FROM id_cursor
    INTO @id
    WHILE @@FETCH_STATUS = 0
    BEGIN
        INSERT INTO tbl1(id) VALUES (@id)
        FETCH NEXT FROM id_cursor
        INTO @id
    END;
     
    CLOSE id_cursor
    DEALLOCATE id_cursor
    Delphine

  11. #11
    Membre actif
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Points : 206
    Points
    206
    Par défaut
    la syntaxe exacte est:

    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
    20
     
    DECLARE @id int 
    DECLARE CURSOR id_cursor For 
    SELECT id 
    FROM tbl1 
    WHERE id NOT IN (SELECT id FROM tbl2) 
     
    OPEN id_cursor 
     
    FETCH NEXT FROM id_cursor INTO @id 
     
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
        INSERT INTO tbl2(id) VALUES (@id) 
     
        FETCH NEXT FROM id_cursor  INTO @id 
    END; 
     
    CLOSE id_cursor 
    DEALLOCATE id_cursor
    INSERT INTO tbl1(id) VALUES (@id)
    je suppose que l'insert se fait tbl2 et non dans tbl1.

    IL ya par contre une façon plus simple de faire pour ce que tu veux faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    insert into tbl2(id)
    SELECT id 
    FROM tbl1 
    WHERE id NOT IN (SELECT id FROM tbl2)
    A+

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 35
    Points : 29
    Points
    29
    Par défaut
    Waouuuhhhhhhhh !!!! Ca marche enfin.
    Un grand Merci pour ton aide!

    Tip Top !!

    @+
    Delphine

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

Discussions similaires

  1. Insert dans base sql erroné
    Par krapoulos dans le forum Langage
    Réponses: 1
    Dernier message: 18/10/2010, 06h14
  2. Migration de données Insertion dans MS SQL
    Par tatemilio2 dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 15/07/2010, 17h05
  3. Réponses: 4
    Dernier message: 02/03/2009, 11h46
  4. [SQL] Problème insertion dans Base SQL après saisie d'un formulaire
    Par Yagami_Raito dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 15/05/2007, 13h44
  5. Insertion dans table SQL server (Trigger) Aidz moi SVP????
    Par pop bob dans le forum Développement
    Réponses: 2
    Dernier message: 30/07/2005, 23h55

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