|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : février 2011 Messages : 70 ![]() |
Bonjour,
J'ai un script qui me permet de faire plusieurs INSERT dans différentes tables et j'aimerais m'assurer que lorsque commence un INSERT le premier soit fini. Je ne peux pas utiliser GO car je déclare une variable au début de mon script. Sinon il faudrait que je déclare cette variable avant chaque INSERT. Comment puis je faire ? Exemple de mon code : Code :
|
||
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Bonjour,
Il n'y a pas besoin de s'en assurer puisque les instructions sont implicitement exécutées comme transactions dans l'ordre où vous les spécifiez. @++
__________________
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 |
|
00
|
|
|
#3 |
|
Candidat au titre de Membre du Club
![]() Inscription : février 2011 Messages : 70 ![]() |
Ha ok ... bizarre puisque j'ai eu une erreur d'insertion de donnée à cause d'une FK qui correspondait à l'insertion d'avant sachant que celle ci s'était bien passé.
Et en reprenant juste l'insertion qui plantait et en l’exécutant dans une autre fenêtre je n'ai pas eu de soucis ...
|
|
|
00
|
|
|
#4 |
![]() ![]() ![]() |
Est ce que tu peux nous donner la définition des tables ainsi le code que tu exécutes et qui poserait problème ?
__________________
Découvrez la FAQ de MS SQL Server. La chance accorde ses faveurs aux esprits avertis ! |
|
|
00
|
|
|
#5 | ||||||
|
Candidat au titre de Membre du Club
![]() Inscription : février 2011 Messages : 70 ![]() |
Alors voici les tables qui posent problème.
Tout d'abord le script de création de ces 2 tables, sans compter les index. Code :
Code :
Pour info je vais chercher les données sources sur un serveur lié que je rapatrie ensuite sur ma base locale. J'ai pas mal de table remplie de cette manière ... Code :
|
||||||
|
|
00
|
|
|
#6 |
![]() ![]() ![]() |
Je pense qu'il faut que tu commences par des insert dans la table famille avant de faire des insert dans la table donnes.
C'est ca ton problème.
__________________
Découvrez la FAQ de MS SQL Server. La chance accorde ses faveurs aux esprits avertis ! |
|
|
00
|
|
|
#7 |
|
Candidat au titre de Membre du Club
![]() Inscription : février 2011 Messages : 70 ![]() |
Bin non justement, vu que je ne détruis pas mes contraintes de FK, les données doivent d'abord être présente dans la table Donnee pour ensuite remplir la table Famille qui a une colonne IdDonneeLibelle qui pointe vers les données IdDonnee de la table Donnee.
Si je fais le contraire, je vais avoir une erreur d'insertion (FK_Famille_Donnee) me disant que les données IdDonneeLibelle pointent vers aucune données de la table Donnee ... Ce qui me parait bizarre c'est que je fais les mêmes insertions sur d'autres tables et cela pose aucun problème ... d'où mon incompréhension de l'erreur ! |
|
|
00
|
|
|
#8 | ||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Vous avez effectivement raison, c'est l'inverse
Donc cela signifie que l'INSERT que vous réalisez dans la table dbo.Donnee ne contient pas la valeur de IdDonneeLibelle dont vous avez besoin pour réaliser l'INSERT dans la table dbo.Famille. Il me semble que la valeur manquante est donnée dans le libellé de l'erreur sur violation de clé étrangère Si ce n'est pas le cas, pour trouver les valeurs qui "manquent", il vous faut exécuter : Code :
__________________
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 |
||
|
00
|
|
|
#9 |
|
Candidat au titre de Membre du Club
![]() Inscription : février 2011 Messages : 70 ![]() |
En fait j'ai déjà chercher les IdDonneeLibelle qui manque et je n'en trouve pas via des Not Exists ...
Et en ré-exécutant le script, l'insertion se passe sans problème ... En fait l'insertion ds la table Donnee se passe bien, j'ai bien 31 insertions Et quand je regarde dans la famille, j'ai bien ces 31 ID ... Mais je vais tester les requêtes récursives pour voir ! |
|
|
00
|
|
|
#10 |
|
Candidat au titre de Membre du Club
![]() Inscription : février 2011 Messages : 70 ![]() |
Je viens d'essayer la requête récursive ... aucun résultats ...
*PAN* |
|
|
00
|
|
|
#11 |
|
Candidat au titre de Membre du Club
![]() Inscription : février 2011 Messages : 70 ![]() |
En fait, je me demande si je n’atteins pas le cache mémoire ou je ne sais quoi qui fait que ça plante ....
Parce que franchement je vois pas d'où peut venir l'erreur ... |
|
|
00
|
|
|
#12 | ||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Attention : une expression de table commune n'est pas forcément récursive, et c'est le cas des deux que je vous ai proposé.
Je me suis trompé dans la demi-jointure gauche, excusez-moi : Code :
@++
__________________
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 |
||
|
00
|
|
|
#13 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : février 2011 Messages : 70 ![]() |
J'ai lancé la requête après mon script d'insertion et donc après plantage !
J'ai bien des réponses ... Code :
Mais ces valeurs sont bien présente dans ma table Donnee précédemment remplies et donc dans le serveur lié ... Je comprends plus rien ! |
||
|
|
00
|
|
|
#14 | ||||||
|
Candidat au titre de Membre du Club
![]() Inscription : février 2011 Messages : 70 ![]() |
En fait je suis sur une piste ...
Lors de ma deuxième insertion de données dans la table Famille, je cherche à insérer les données dans la table depuis la table source en tenant compte des données déjà présentes. Et c'est lors de ce test que j'obtiens une erreur !! Je retourne bien 31 lignes ... Je cherche les données dans la base source qui ne sont pas encore insérées dans la table de la base test. Code :
Code :
Code :
ou alors je me trompe ? Et dans ce cas, comment je m'assure que j'enregistre seulement les données dont j'ai besoins ? |
||||||
|
|
00
|
|
|
#15 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : février 2011 Messages : 70 ![]() |
En fait, je crois que je viens de trouver la réponse ...
Ma requête d'insertion était fausse : Dans ma première requête j'insère bien les 31 résultats, et lors de ma deuxième requête, pour insérer les Familles, je retourne 51 résultats à cause de ma condition qui était fausse. Ma requête me retourne ces 51 résultats car, elle me retourne bien les ProduitClient = 2 ET ceux qui ne sont pas dans la table Test (donc les 20 autres lignes) En fait je voulais faire une requête d'insertion qui insert QUE les données dont j'ai besoins ! Du coup la requête devient, corrigez moi si je me trompe : Code :
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com