Question

Désolé pour la longueur, j'essaie de donner beaucoup d'informations pour éviter des solutions non pertinentes.

Mon objectif est d'intégrer au moins 1 instruction UPDATE dans une instruction SELECT afin d'avoir la possibilité de mettre à jour certaines valeurs calculées juste avant l'exécution de l'instruction select (pensez-y comme un TRIGGER sur SELECT).VIEW n'est pas en solution immédiate, puisque je suis contraint par le système que j'utilise (voir ci-dessous).

Je personnalise un ERP commercial tiers qui manque de fonctionnalités (le système restera anonyme !- le résultat est que vous n'en avez pas entendu parler, mais ce n'est pas non plus une production locale).Il dispose d'une fonction de requête prédéfinie où je peux utiliser un texte/une interface graphique pour créer une requête SELECT.Une fois que j'ai enregistré une requête, les utilisateurs peuvent cliquer sur la requête pour l'exécuter et voir les résultats.L'ERP fonctionne sur MS SQL Server 2000 ;la mise à niveau de la version n'est PAS prévue pour le moment.Je peux écrire n'importe quel ensemble de fonctionnalités dont j'ai besoin en dehors de l'ERP dans la langue de mon choix, je l'ai fait dans le passé, si les fonctionnalités le justifient.Mais ma communauté d’utilisateurs trouve la tâche plus facile lorsque mes personnalisations peuvent être effectuées dans le système ERP.

La requête peut être arbitrairement complexe, mais le package ERP crée lui-même l'instruction SQL Select.L'ERP compilé ressemble à ceci (ce n'est qu'une supposition !) :

"SELECT " + fieldList + " FROM " + tableListAndJoins + " WHERE " + whereCond

Le générateur d'interface graphique aide les utilisateurs novices à créer la fieldList, etc., mais vous pouvez le contourner et écrire les clauses sous forme de texte tant que le SQL est valide lorsqu'il est combiné comme ci-dessus.

Je n'arrive pas à trouver une incantation pour exécuter une procédure stockée comme effet secondaire d'une instruction SELECT, que ce soit dans la clause select, la clause WHERE, etc.Je me fiche vraiment de la façon dont je jailbreake le système - une attaque par injection SQL stable conviendrait, tant que cela ne signifie pas que je dois modifier la sécurité du serveur SQL sous-jacent lui-même.J'ai regardé les UDF, mais vous ne pouvez pas mettre une instruction UPDATE dans une UDF scalaire, et cela n'a pas de sens d'essayer de modifier le retour d'une table UDF (n'est-ce pas ?).Si vous pouvez METTRE À JOUR à partir d'une VUE, j'aimerais voir un exemple, mais je me rends compte que je peux utiliser une VUE pour calculer des colonnes et ce n'est pas la solution que je recherche.J'ai lu en ligne une déclaration suggestive sur la possibilité d'utiliser une sorte de XP_ pour accomplir cela, mais quant à quel XP_ ou comment le faire, je ne sais pas.

cette question n'est PAS une solution en soi : Mise à jour d'une table dans une instruction select

Était-ce utile?

La solution

Je ne peux pas penser à une façon de combiner un SELECT une mise à jour dans SQL 2000 (bien que, en 2005 et plus, la clause de sortie est disponible). Cependant, il semble que vous obtenez trois valeurs de chaîne (fieldList, tableListAndJoins, WhereCond) qui se concaténés avec « SELECT », « FROM » et « où », et en supposant qu'ils ne le font pas une détection grave de code comme injenction SQL, vous pourriez être en mesure de kludge ensemble quelque chose comme ceci:

fileList = "NULL where 1 = 0; UPDATE MyTable set MyColumn = 'Whatever' where SomeColumn = 'Criteria'; SELECT MyColumn"

tableListAndJoins = "MyTable"

whereCond = "SomeColumn = 'Criteria'"

[Les points-virgules sont en fait optionnels, et pourraient même ne pas fonctionner dans SQL 2000 -. Ils ne font clairement où l'on commande se termine et commence la suivante]

L'inconvénient est que vous récupérerez deux ensembles de données. Le premier sera un ensemble d'une colonne vide (alias NULL si vous voulez un nom à la colonne), et les données que vous voulez sera dans le deuxième set. D'autres contournements pourrait être possible, selon la façon dont ces trois valeurs sont utilisées et comment les erreurs sont pris. (Que cette première requête générer et d'erreurs, et nous espérons la mise à jour et la deuxième requête passent par?)

Autres conseils

Essayez d'utiliser SQL dynamique dans la procédure stockée comme indiqué dans la dernière réponse ici

Lié afin que l'auteur original puisse obtenir les crédits qu'il mérite et, nous l'espérons, vous sera utile.

Et puisque vous voulez SELECT avant la MISE À JOUR, vous pouvez modifier le SQL dynamique comme dans le lien que j'ai posté, pour faire le SELECT en premier.

Je ne suis pas sûr que je comprends les contraintes de votre situation, mais pouvez-vous pas seulement exécuter deux déclarations à la fois, comme:

string sql = "update MyTable set x=y;select x from MyTable;";

Est-ce qu'une fonction stockée une option? Vous pouvez appeler ceux qui sont plus de façon transparente (en MySQL au moins) que les procédures stockées -. Au lieu de « appeler PROCEDURE_NAME (x) » vous pouvez simplement utiliser « SELECT FUNCTION_NAME (x) »

Je pense avec le XP est que vous écrivez votre propre XP pour faire la mise à jour et l'inclure dans la requête en quelque sorte. Si oui ou non cela pourrait fonctionner et où dans la requête qu'il devrait aller de manière à être exécutée avant SQL regarde vos données me dépasse complètement.

On dirait que vous avez essayé à peu près tout ce que je voudrais essayer. Je me sens pour vous parce que ce serait probablement assez facile de mettre à jour l'état après vous avez exécuté le select.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top