Domanda

Scusate per la lunghezza di questo, sto cercando di dare un sacco di informazioni al fine di evitare soluzioni non rilevanti.

Il mio obiettivo è quello di incorporare almeno 1 UPDATE in un'istruzione SELECT in modo da avere la possibilità di aggiornare alcuni valori calcolati presso l'istante prima che i selezionare eseguita l'istruzione (pensare ad esso come un TRIGGER su SELECT). Vista non è in soluzione immediata, dal momento che sto costretto dal sistema che sto utilizzando (vedi sotto).

Sono la personalizzazione di un 3rd party ERP di commercio che è debole sulle caratteristiche (sistema rimarrà senza nome - è risultato non avete sentito parlare, ma non è di produzione propria o). Ha un impianto di query in scatola dove posso utilizzare un testo / GUI per costruire una query SELECT. Una volta ho salvare una query, gli utenti possono fare clic sulla query per eseguirla e vedere i risultati. ERP gestisce in cima a MS SQL Server 2000; aggiornamento di versione non è nelle carte al momento. Posso scrivere quello set di funzionalità ho bisogno di fuori del ERP in qualsiasi lingua che voglio, ho fatto in passato, se le caratteristiche lo richiedano. Ma la mia comunità di utenti trova più facile quando i miei personalizzazioni possono essere fatte nel sistema ERP.

La query può essere arbitrariamente complessa, ma il pacchetto ERP costruisce lo SQL Select stessa. Interno alla ERP compilato è qualcosa di simile (questa è solo una supposizione!):

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

La GUI builder aiuta gli utenti meno esperti a costruire il fieldList e così via, ma è possibile ignorare e scrivere le clausole di testo fino a quando l'SQL è valida quando combinato come sopra.

Non riesco a trovare un incantesimo per eseguire una stored procedure come effetto collaterale di un'istruzione SELECT, se è nella clausola di selezione, in cui la clausola, ecc ho davvero non mi interessa come mi jailbreak del sistema - - un attacco di SQL injection stabile andrebbe bene, fintanto che non significava ho dovuto modificare la sicurezza del server di SQL sottostante stesso. Ho guardato le UDF, ma non si può mettere un'istruzione UPDATE in un'UDF scalare, e non ha senso cercare di modificare il ritorno di un UDF tavolo (o lo fa?). Se è possibile aggiornare da all'interno di una vista poi mi piacerebbe vedere un esempio, ma mi rendo conto che posso usare al fine di calcolare le colonne e che non è la soluzione che sto cercando. Ho letto una dichiarazione suggestiva linea di essere in grado di utilizzare una sorta di XP_ per raggiungere questo obiettivo, ma su quale XP_ o come farlo, non lo so.

Questa domanda non è una soluzione, in sé e per sé: Aggiornamento di un tavolo all'interno di una dichiarazione prescelta

È stato utile?

Soluzione

Non riesco a pensare a un modo per combinare un SELECT con un aggiornamento a SQL 2000 (anche se nel 2005 e fino, la clausola di uscita è disponibile). Tuttavia, sembra che si ottiene tre valori stringa (fieldList, tableListAndJoins, whereCond) che vengono concatenati insieme a "SELECT", "da" e "DOVE", e assumendo non fanno alcuni gravi rilevamento di codice SQL injenction-like, si potrebbe essere in grado di kludge insieme qualcosa di simile:

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

tableListAndJoins = "MyTable"

whereCond = "SomeColumn = 'Criteria'"

[I punti e virgola sono in realtà facoltative, e potrebbe anche non funzionare in SQL 2000 -. Semplicemente rendono chiaro dove finisce comando e inizia il successivo]

Il rovescio della medaglia è che si otterrà indietro di due insiemi di dati. Il primo sarà un vuoto a una colonna set (alias NULL, se si desidera un nome alla colonna), ed i dati che si desidera sarà nel secondo set. Altri work-around potrebbe essere possibile, a seconda di come vengono utilizzati questi tre valori e di come gli errori sono catturati. (Lasciate che prima query generare ed errori, e la speranza l'aggiornamento e la seconda query passano?)

Altri suggerimenti

Provare a utilizzare SQL dinamico nella stored procedure come dichiarato sull'ultimo risposta qui

Collegato in modo che l'autore originale può ottenere i crediti che lui / lei merita, e, auspicabilmente, sarà utile a voi.

E dal momento che si desidera SELEZIONA prima dell'aggiornamento, è possibile modificare l'SQL dinamico come nel link che ho postato, a fare la prima selezionare.

Non sono sicuro di capire i limiti della vostra situazione, ma si può non solo eseguire due istruzioni in una sola volta, come ad esempio:

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

Sarebbe una funzione memorizzata essere un'opzione? È possibile chiamare quelli più senza soluzione di continuità (in MySQL almeno) di stored procedure -. Invece di "chiamare procedure_name (x)" si può semplicemente utilizzare "SELECT FUNCTION_NAME (x)"

La mia ipotesi con l'XP è che si può scrivere il proprio XP per fare l'aggiornamento e includerlo nella query in qualche modo. O se non che avrebbe funzionato e dove nella query dovrebbe andare in modo da essere eseguito prima di SQL guarda i tuoi dati sono completamente al di là di me.

Sembra che hai provato quasi tutto ciò che vorrei provare. Mi sento per voi, perché probabilmente sarebbe piuttosto facile per aggiornare lo stato di dopo è stato eseguito il select.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top