0
votes

Syntaxe correcte pour insérer dans la requête SELECT

J'essaie d'insérer des enregistrements supprimés d'une table dans une autre afin que je puisse archiver les enregistrements supprimés, en quelque sorte comme la corbeille de recyclage de Windows. Pour ce faire, j'utilise un insert dans la requête SELECT:

<cfquery name="archiveDeletion" datasource="#application.dsn#">
    INSERT INTO deletedCylinderContentRecords (air_emissions, barcode, building, capacity, Carcinogen, carcinogen_comment, carcinogen_type, cas, casORmixture, chemicalname, concentration, containermaterial, containertype, cyanide, CylinderID, dotdivision, dothazardclass, dothazardclassSub, expirationdate, flashpoint, formula, grade, HMAR_ID, hydroflouric_acid, HydrostaticTestDate, HydrostaticTestDueDate, initial_quantity, inventoried, isdeleted, lastupdated, LeakTestDate, location, manufacturer, ModifiedBy, msds, MSDS_Scan, MSN, Mutagen, nfpablue, nfpared, nfpawater, nfpayellow, ownerid, PeroxideConcentration, PeroxideFormers, PeroxideTestDate, PeroxideTestDueDate, phaseID, PList, price, Purchase_Scan, Purchase_Scan_Link, purchasedate, remarks, ResearchSampleNo, room, sewer, shelf, ShockSensitive, specificgravity, spillage, spillclass, SPInspect, SPInspectDate, SPInterval, stocknumber, StorageRemarks, Teratogen, Undelete, units, usage_comments, usage_transferred, usage_transferred_to, usedinprocess, Validate, ValidateBy, ValidateDate, vendor, VendorNumber, waste, deleterName, timeDeleted, reasonDeleted)
    SELECT * FROM containers WHERE barcode = '#session.barcode#',
    <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#getDeleterName.last_name#, #getDeleterName.first_name# #getDeleterName.middle_initial#.">,
    SYSDATETIME(),
   <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#Form.deleteReason5#">
</cfquery>


5 commentaires

@Larnu Devrais-je me débarrasser de la virgule?


Vous devez ajouter les colonnes supplémentaires dans la section de colonne de votre instruction SELECT. De plus, je vous découragerais fortement de l'utilisation *. Vous devriez nommer explicitement les colonnes. Si l'une ou l'autre de vos tables change, votre code sera cassé. Sur une note latérale, je n'avais aucune idée que les gens écrivent encore un nouveau code avec Coldfusion.


J'ai mal compris le code là-bas, mon mauvais.


Quelle version de SQL Server? Vous ne devriez pas avoir à revenir aux FC pour archiver les lignes que vous souhaitez supprimer. Vous pouvez faire tout cela dans SQL.


Ou mieux encore, ne supprimez pas le disque. Ajouter un void (bit) Colonne de défaut sur 0 , puis update it to 1 lorsque vous "supprimez" un enregistrement. Ensuite, vous pouvez avoir un processus SQL revenir en arrière et archiver tous les enregistrements annulés.


3 Réponses :


0
votes

C'est un commentaire trop long pour s'adapter aux commentaires

Permettez-moi de le rendre lisible xxx

retour au problème à la main. < P> Je n'ai pas de DEA ce que cela est censé être. Essayez-vous de faire un groupe d'etrs? Essayez-vous d'ajouter plus de colonnes à la sélection? Pourquoi le code à barres n'est pas dans cfqueryparam param qu'un tas de morceaux de données a l'air vraiment étrange. Je m'attendrais à voir trois paramètres pour les trois parties du nom. Puis encore peut-être que c'est ainsi que les données sont stockées. Dernier point mais non le moindre, je pense que toutes les colonnes doivent figurer dans l'instruction SELECT. Pas sûr * fonctionnera (je pourrais avoir tort) xxx


1 commentaires

Oui, j'essaie d'ajouter plus de colonnes à ma sélection, alors je ne pense pas qu'un tas d'etrs serait la bonne syntaxe. Je suppose que je mets la clause Où après la dernière balise CFQUERYPARAM? Vous n'avez pas changé ma requête dans votre réponse.



1
votes

Grâce à ce que @Seanlange a dit dans les commentaires, j'ai trouvé la solution. J'ai ajouté les trois colonnes supplémentaires ne faisant pas partie de la table code> conteneurs code> dans la requête code> SELECT CODE>, et assurez-vous que cela a fonctionné. J'ai également appelé explicitement les colonnes au lieu d'utiliser le sélecteur * code>, la solution finale ressemblait à ceci:

<cfquery name="archiveDeletion" datasource="#application.dsn#">
    INSERT INTO deletedCylinderContentRecords (air_emissions, barcode, building, capacity, 
    Carcinogen, carcinogen_comment, carcinogen_type, cas, casORmixture, chemicalname, concentration,
    containermaterial, containertype, cyanide, CylinderID, dotdivision, dothazardclass,
    dothazardclassSub, expirationdate, flashpoint, formula, grade, HMAR_ID, hydroflouric_acid,
    HydrostaticTestDate, HydrostaticTestDueDate, initial_quantity, inventoried, isdeleted, lastupdated, 
    LeakTestDate, location, manufacturer, ModifiedBy, msds, MSDS_Scan, MSN, Mutagen, nfpablue, nfpared,
    nfpawater, nfpayellow, ownerid, PeroxideConcentration, PeroxideFormers, PeroxideTestDate,
    PeroxideTestDueDate, phaseID, PList, price, Purchase_Scan, Purchase_Scan_Link, purchasedate,
    remarks, ResearchSampleNo, room, sewer, shelf, ShockSensitive, specificgravity, spillage,
    spillclass, SPInspect, SPInspectDate, SPInterval, stocknumber, StorageRemarks, Teratogen,
    Undelete, units, usage_comments, usage_transferred, usage_transferred_to, usedinprocess, Validate, 
    ValidateBy, ValidateDate, vendor, VendorNumber, waste, deleterName, timeDeleted, reasonDeleted)
    SELECT air_emissions, barcode, building, capacity, Carcinogen, carcinogen_comment, carcinogen_type,
    cas, casORmixture, chemicalname, concentration, containermaterial, containertype, cyanide, 
    CylinderID, dotdivision, dothazardclass, dothazardclassSub, expirationdate, flashpoint, formula,
    grade, HMAR_ID, hydroflouric_acid, HydrostaticTestDate, HydrostaticTestDueDate, initial_quantity,
    inventoried, isdeleted, lastupdated, LeakTestDate, location, manufacturer, ModifiedBy, msds, 
    MSDS_Scan, MSN, Mutagen, nfpablue, nfpared, nfpawater, nfpayellow, ownerid, PeroxideConcentration,
    PeroxideFormers, PeroxideTestDate, PeroxideTestDueDate, phaseID, PList, price, Purchase_Scan,
    Purchase_Scan_Link, purchasedate, remarks, ResearchSampleNo, room, sewer, shelf, ShockSensitive,
    specificgravity, spillage, spillclass, SPInspect, SPInspectDate, SPInterval, stocknumber,
    StorageRemarks, Teratogen, Undelete, units, usage_comments, usage_transferred, usage_transferred_to, 
    usedinprocess, Validate, ValidateBy, ValidateDate, vendor, VendorNumber, waste,
    <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#getDeleterName.last_name#, #getDeleterName.first_name# #getDeleterName.middle_initial#.">,
    SYSDATETIME(),
    <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#Form.deleteReason5#">
    FROM containers WHERE barcode = '#session.barcode#'
</cfquery>


0 commentaires

0
votes

@max VOISARD, j'ai traversé votre code. J'ai trouvé les autres problèmes dans toute votre requête.

  • Dans votre requête SELECT, vous avez l'endroit comme où code à barres = '# session.barcode #', (nous n'avons pas besoin d'une virgule ici.) Après cela, vous avez écrit un cfqueryparam. Qui est tout à fait faux. Tu devrais Utilisez l'opérateur et / ou pour vérifier la condition suivante avec certaines colonnes.
  • Dans votre premier QueryParam, vous avez utilisé la liste des valeurs en valeur Attribut, alors vous devez utiliser "list = true" . Donc votre requête devrait être comme XXX

  • et selon la suggestion ci-dessus, n'utilisez pas * dans votre requête sélectionnée. Essayez de mettre les noms de colonne mentionnés. Voici ma requête d'échantillon pour vous avec quelques conditions.

    insérer dans la table1 (ID, nom, âge) Sélectionnez une pièce d'identité, nom, âge de la table2 Où âge <10 et ID <9 <9 / P>

    J'espère que cela vous aidera davantage :). Merci.


1 commentaires

Merci pour votre réponse. En fait, je n'utilisais pas les balises pour conditions de mon article; Je voulais juste qu'ils font également partie de ma requête sélectionnée. Si vous voyez ma réponse, je suis tout corrigé.