Frage

Sorry für die Länge dieses, Ich versuche, eine Menge Informationen zu geben, nicht-relevante Lösungen zu vermeiden.

Mein Ziel ist es mindestens 1 UPDATE-Anweisung in eine SELECT-Anweisung einbetten, so dass ich eine Chance haben einige berechneten Werte zu dem Zeitpunkt, bevor die select-Anweisung läuft (man denke an sie wie ein TRIGGER auf SELECT) zu aktualisieren. VIEW ist nicht in unmittelbarer Lösung, da ich durch das System gezwungen bin ich verwende (siehe unten).

Ich bin Anpassung einen 3rd-Party-Handel ERP, die auf Funktionen schwach ist (System bleibt namenlos - Ergebnis wird Sie nicht davon gehört, aber es ist nicht zu Hause entweder gewachsen). Es hat eine Dose Abfrage Einrichtung, wo ich einen Text / GUI verwenden kann, eine SELECT-Abfrage zu erstellen. Sobald ich eine Abfrage speichern, können die Benutzer auf die Abfrage klicken, um sie auszuführen und die Ergebnisse zu sehen. ERP läuft oben auf MS SQL Server 2000; Versions-Upgrade ist in den Karten nicht jetzt. Ich kann schreiben, was Feature-Set I außerhalb des ERP muß in welcher Sprache ich will, ich habe dies in der Vergangenheit getan, wenn die Features, die es rechtfertigen. Aber meine User-Community findet es einfacher, wenn meine Anpassungen können im ERP-System durchgeführt werden.

Die Abfrage kann beliebig komplex sein, aber das ERP-Paket baut die SQL-Select-Anweisung selbst. Interne an die kompilierten ERP ist so etwas wie dies (das ist nur eine Vermutung!):

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

Die GUI-Builder helfen unerfahrener Anwender beim Aufbau die Feldliste und so weiter, aber man kann es umgehen und die Klauseln in Text schreiben, solange die SQL gilt, wenn, wie oben kombiniert werden.

Ich kann nicht scheinen, eine Beschwörung zu finden, eine gespeicherte Prozedur als Nebenwirkung einer SELECT-Anweisung ausgeführt werden, ob es in der select-Klausel ist, wo Klausel, etc. Ich weiß nicht wirklich, wie ich das System Jailbreak - - ein stabiler SQL-Injection-Angriff wäre in Ordnung, solange es nicht bedeuten, dass ich die Sicherheit des zugrunde liegenden SQL-Servers selbst zu ändern hatte. Ich habe bei UDF sah, aber man kann nicht eine UPDATE-Anweisung in eine skalare UDF setzen, und es macht keinen Sinn, zu versuchen, die Rückkehr einer Tabelle UDF zu ändern (oder doch?). Wenn Sie innerhalb einer Aktualis. können dann würde Ich mag ein Beispiel sehen, aber ich merke, ich VIEW Spalten berechnen verwenden kann, und das ist nicht die Lösung, die ich suche. Ich las eine suggestive Aussage Online, um dies zu erreichen in der Lage, irgendeine Art von xp_ zu verwenden, aber darüber, welche xp_ oder wie es zu tun, ich weiß es nicht.

Diese Frage ist nicht eine Lösung, in und von sich selbst: Aktualisieren einer Tabelle innerhalb einer select-Anweisung

War es hilfreich?

Lösung

Ich kann nicht glauben, von irgendeiner Weise eine SELECT mit einer UPDATE in SQL 2000 zu kombinieren (wenn auch im Jahr 2005 und bis die OUTPUT-Klausel vorhanden ist). Aber es sieht aus wie Sie drei String-Wert erhalten (Feldliste, tableListAndJoins, whereCond), die verkettet erhält zusammen mit „SELECT“, „FROM“ und „WHERE“, und unter der Annahme, dass sie nicht einig ernsthafte SQL injenction-like-Code-Erkennung tun, Sie könnten in der Lage sein, so etwas Flickschusterei zusammen:

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

tableListAndJoins = "MyTable"

whereCond = "SomeColumn = 'Criteria'"

[Die Semikolons sind eigentlich optional, und vielleicht nicht einmal in SQL 2000 arbeiten -. Sie nur deutlich machen, wo ein Befehl endet und die nächste beginnt]

Die Kehrseite der Medaille ist, dass Sie wieder zwei Datensätze erhalten werden. Die erste wird einen leeren-Spaltensatz (alias die NULL, wenn Sie einen Namen für die Spalt wollen) sein, und die Daten, die Sie im zweiten Satz sein sollen. Andere Abhilfen könnte möglich sein, je nachdem, wie diese drei Werte werden verwendet und wie Fehler gefangen. (Lassen Sie die erste Abfrage generieren und Fehler, und hofft, dass die Aktualisierung und die zweite Abfrage durch?)

Andere Tipps

Versuchen Sie es mit dynamischem SQL in der gespeicherten Prozedur wie auf die letzte Antwort angegeben hier

verknüpft, so dass der ursprüngliche Autor die Kredite bekommen kann er / sie verdient, und hoffentlich werden Sie hilfreich sein.

Und da du vor dem UPDATE auswählen möchten, können Sie die dynamische SQL-wie in den Link ändern ich geschrieben, zuerst die gewünschte Funktion auszuwählen.

Ich bin nicht sicher, ob ich die Einschränkungen Ihrer Situation zu verstehen, aber können Sie nicht nur zwei Aussagen laufen auf einmal, wie zum Beispiel:

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

Würde eine gespeicherte Funktion eine Option sein? Sie können diejenigen, die mehr nahtlos nennen (in MySQL mindestens) als gespeicherte Prozeduren -. Statt "nennen PROCEDURE_NAME (x)" Sie können verwenden nur "FUNCTION_NAME SELECT (x)"

Meine Vermutung mit dem XP ist, dass Sie Ihre eigenen XP schreiben würden irgendwie das Update und es in der Abfrage zu tun. Unabhängig davon, ob das funktionieren würde und wo in der Abfrage sollte es gehen, wie so ausgeführt werden, bevor SQL schaut auf Ihren Daten vollständig über mich.

Es klingt wie Sie so ziemlich alles ausprobiert habe ich versuchen würde. Ich fühle mich für Sie, weil es wahrscheinlich ziemlich einfach sein würde, den Zustand zu aktualisieren, nachdem Sie wählen liefen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top