2009-06-29 16 views
6

Ci scusiamo per la lunghezza di questo, sto cercando di fornire molte informazioni per evitare soluzioni non rilevanti.Aggiornamento SQL dall'istruzione select

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). VIEW non è in soluzione immediata, dal momento che sono vincolato dal sistema che sto usando (vedi sotto).

Sto personalizzando un ERP commerciale di terze parti che è debole sulle funzionalità (il sistema rimarrà senza nome! - il risultato è che non ne hai mai sentito parlare, ma non è nemmeno cresciuto a casa). Ha una funzione di interrogazione in scatola dove posso usare un testo/GUI per costruire una query SELECT. Una volta salvata una query, gli utenti possono fare clic sulla query per eseguirla e vedere i risultati. ERP viene eseguito su MS SQL Server 2000; l'aggiornamento della versione NON è nelle carte in questo momento. Posso scrivere qualsiasi set di funzionalità di cui ho bisogno al di fuori dell'ERP in qualsiasi lingua io voglia, l'ho fatto in passato, se le funzionalità lo giustificano. Ma la mia comunità di utenti trova più facile quando le mie personalizzazioni possono essere fatte nel sistema ERP.

La query può essere arbitrariamente complessa, ma il pacchetto ERP crea la stessa istruzione SQL Select. 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 nel testo il più a lungo come SQL è valido quando combinato come sopra.

Non riesco a trovare un incantesimo per eseguire una stored procedure come effetto collaterale di un'istruzione SELECT, sia nella clausola select, dove clausola, ecc. Non mi interessa davvero come faccio a jailbreak del sistema - un attacco di SQL injection stabile andrebbe bene, a patto che non significasse che dovevo modificare la sicurezza del server sql sottostante. Ho esaminato le UDF, ma non è possibile inserire un'istruzione UPDATE in una UDF scalare e non ha senso cercare di modificare il ritorno di una tabella UDF (o no?). Se riesci ad AGGIORNARE da una VISTA, vorrei vedere un esempio, ma mi rendo conto che posso usare una VISTA per calcolare colonne e questa non è la soluzione che sto cercando. Ho letto una dichiarazione allusiva online sulla possibilità di utilizzare una sorta di XP_ per realizzare questo, ma per quanto riguarda XP_ o come farlo, non lo so.

a questa domanda non è una soluzione, in sé e per sé: Updating a table within a select statement

+0

ricerca FYI ulteriore suggerisce che una funzione CLR potrebbe ottenere me c'è ma le funzioni CLR non sono disponibili in SQL 2000. – user130582

risposta

1

Non riesco a pensare a un modo per combinare un SELECT con un UPDATE in SQL 2000 (anche se nel 2005 e fino, la clausola OUTPUT è disponibile). Tuttavia, sembra che si ottengano tre valori stringa (fieldList, tableListAndJoins, whereCond) che vengono concatenati insieme a "SELECT", "FROM" e "WHERE" e presupponendo che non eseguano alcun rilevamento del codice SQL simile a quello di un'iniziativa seria, 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 - hanno appena rendono chiaro dove finisce comando e inizia il successivo.]

Lo svantaggio di questo è che si otterranno due set di dati. Il primo sarà un set vuoto a colonna singola (alias quello NULL se si desidera un nome per la colonna) e i dati desiderati saranno nel secondo set. Altre soluzioni alternative potrebbero essere possibili, a seconda del modo in cui questi tre valori vengono utilizzati e di come vengono rilevati gli errori. (Lasciate che prima query generare ed errori, e la speranza l'aggiornamento e la seconda query passano?)

+0

grazie per leggendo ciò che ho scritto per intero – user130582

0

Prova utilizzando SQL dinamico nella stored procedure come stated on the last reply here

Collegato in modo che l'autore originale può ottenere i crediti che lui/lei merita, e si spera ti sarà utile.

E poiché si desidera SELEZIONARE prima dell'aggiornamento, è possibile modificare lo sql dinamico come nel collegamento che ho postato, per fare prima SELECT.

0

io non sono sicuro di capire i limiti della vostra situazione, ma si può non solo eseguire due istruzioni contemporaneamente, come ad esempio:

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

Sarebbe una funzione memorizzata essere un'opzione? Puoi chiamarli più facilmente (almeno in MySQL) rispetto alle stored procedure - invece di "chiamare PROCEDURE_NAME (x)" puoi semplicemente usare "SELECT FUNCTION_NAME (x)".

0

La mia ipotesi con l'XP è che si scriverà il proprio XP per fare l'aggiornamento e includerlo nella query in qualche modo. Indipendentemente dal fatto che funzioni o meno e dove nella query dovrebbe andare in modo tale da essere eseguito prima che SQL guardi i tuoi dati sia completamente al di fuori di me.

Sembra che tu abbia provato praticamente tutto ciò che vorrei provare. Sento per te perché probabilmente sarebbe piuttosto semplice aggiornare lo stato dopo il che hai eseguito la selezione.