J'utilise ColdFusion for pour un projet et j'ai une requête écrite qui peut être plus rapide en utilisant une procédure stockée, mais je ne suis pas une personne T-SQL, donc Je ne suis pas sûr de savoir comment le faire pour comparer.Mise à jour de la table basée sur Sélectionner une requête dans la procédure stockée/ColdFusion
Je lance une requête initiale qui sélectionne un nombre de champs d'une table basée sur une requête cfqu dynamiquement construite. Je pense que je sais comment convertir cette requête dans la procédure stockée SQL Server.
Cependant, directement après cela, je prends tous les ID de clé primaire de cette requête et exécute une autre requête sur une table distincte qui «verrouille» les enregistrements avec ces ID. Le verrou est un champ de bits (un drapeau) dans la seconde table qui indique au système que cet enregistrement est "extrait". J'ai enveloppé les deux requêtes dans un cftransaction
afin qu'ils s'exécutent en tant qu'unité.
code Vue d'ensemble:
<cftransaction>
<cfquery name="selectQuery">
SELECT id, field2, field3
FROM table1
WHERE (bunch of conditions here)
</cfquery>
<cfquery name="updateQuery">
UPDATE table2
SET lockField = 1
WHERE table2.id IN (#ValueList(selectQuery.id#)
</cfquery>
</cftransaction>
Je reviens alors à selectQuery mon application resultset qui l'utilise pour produire des données. Comment pourrais-je accomplir la même chose dans une seule procédure stockée SQL Server 2008 que je pourrais appeler en utilisant cfstoredproc
? Encore une fois, je pense que le chemin CF natif (avec cfquery
) n'est pas aussi efficace qu'une procédure stockée puisque je dois ramener le résultat à CF, puis réappeler une autre requête à la DB. Une procédure stockée unique fait tout dans la base de données et renvoie ensuite le jeu de résultats de requête d'origine à utiliser.
Des idées?
Ok, j'ai besoin d'un test de santé pour cette réponse. Les données de table1 sont en flux constant ... c'est essentiellement une file d'attente. Parce que c'est dans un seul storedproc, il fonctionne essentiellement comme une seule transaction, n'est-ce pas? Ce qui signifie, puisque je cours deux fois le SELECT sur la table 1, je dois garantir que je reçois les mêmes résultats les deux fois. Comme de nombreux utilisateurs utiliseront régulièrement cette fonction, je dois m'assurer que le "verrouillage" fonctionne correctement. –
Non, ce n'est pas une transaction unique. Si vous avez besoin des données pour la sortie avant d'exécuter la mise à jour, vous devrez le faire différemment. Je n'ai pas compris toute la question du verrouillage dans votre question. –