2009-06-29 7 views
6

Disculpe por la duración de esto, estoy tratando de dar mucha información para evitar soluciones no relevantes.Actualización de SQL desde la instrucción de selección

Mi objetivo es incrustar al menos 1 instrucción UPDATE en una instrucción SELECT para que tenga la oportunidad de actualizar algunos valores calculados en el instante antes de que se ejecute la instrucción select (piénselo como un GATILLO en SELECCIONAR). VIEW no está en una solución inmediata, ya que estoy limitado por el sistema que estoy usando (ver a continuación).

Estoy personalizando un ERP comercial de un tercero que es débil en las características (¡el sistema seguirá siendo anónimo! - El resultado es que no ha oído hablar de él, pero tampoco lo ha hecho en casa). Tiene una función de consulta enlatada donde puedo usar un texto/GUI para construir una consulta SELECT. Una vez que guardo una consulta, los usuarios pueden hacer clic en la consulta para ejecutarla y ver los resultados. ERP se ejecuta encima de MS SQL Server 2000; la actualización de la versión NO está en las tarjetas en este momento. Puedo escribir cualquier conjunto de características que necesite fuera del ERP en el idioma que desee, he hecho esto en el pasado, si las características lo ameritan. Pero a mi comunidad de usuarios les resulta más fácil cuando se pueden realizar mis personalizaciones en el sistema ERP.

La consulta puede ser arbitrariamente compleja, pero el paquete ERP crea la propia instrucción SQL Select. Interna a la ERP compilado es algo como esto (esto es sólo una conjetura!):

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

El constructor de interfaz gráfica de usuario ayuda a los usuarios novatos construir el fieldList y así sucesivamente, pero se puede prescindir de ella y escribir las cláusulas en el texto, siempre y como el SQL es válido cuando se combina como arriba.

Parece que no puedo encontrar un encantamiento para ejecutar un procedimiento almacenado como un efecto secundario de una instrucción SELECT, ya sea en la cláusula select, cláusula where, etc. Realmente no me importa cómo hago jailbreak en el sistema - un ataque de inyección SQL estable estaría bien, siempre y cuando no significara que tuviera que modificar la seguridad del servidor SQL subyacente. He observado las UDF, pero no se puede poner una instrucción UPDATE en una UDF escalar, y no tiene sentido intentar modificar la devolución de una tabla UDF (¿o no?). Si puede ACTUALIZAR desde dentro de una VISTA, me gustaría ver un ejemplo, pero me doy cuenta de que puedo usar una VISTA para calcular columnas y esa no es la solución que estoy buscando. Leí una sugestiva declaración en línea sobre poder usar algún tipo de XP_ para lograr esto, pero en cuanto a qué XP_ o cómo hacerlo, no sé.

esta pregunta no es una solución, en sí mismo: Updating a table within a select statement

+0

FYI investigación adicional sugiere que una función CLR podría llevarme allí, pero las funciones CLR no están disponibles en SQL 2000. – user130582

Respuesta

1

No se me ocurre ninguna forma de combinar un SELECT con una ACTUALIZACIÓN en SQL 2000 (aunque en 2005 y en adelante, la cláusula OUTPUT está disponible). Sin embargo, parece que obtienes tres valores de cadena (fieldList, tableListAndJoins, whereCond) que se concatenan junto con "SELECT", "FROM" y "WHERE", y suponiendo que no hacen una detección de código de tipo SQL grave, como la detección grave. usted podría ser capaz de kludge juntos algo como esto:

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

tableListAndJoins = "MyTable" 

whereCond = "SomeColumn = 'Criteria'" 

[los puntos y comas son en realidad opcional, y ni siquiera podrían funcionar en SQL 2000 - que sólo dejan claro dónde termina un comando y comienza el siguiente.]

La desventaja de esto es que recuperarás dos conjuntos de datos. El primero será un conjunto vacío de una columna (alias NULL si desea un nombre para la columna) y los datos que desee estarán en el segundo conjunto. Es posible que ocurran otras soluciones, según cómo se usen estos tres valores y cómo se capturen los errores. (Deje que la primera consulta genere y error, y espero que la actualización y la segunda consulta pasen?)

+0

gracias por leyendo lo que escribí en su totalidad – user130582

0

Trate de usar SQL dinámico en el procedimiento almacenado como stated on the last reply here

vinculado de manera que el autor original puede obtener los créditos que él/ella se merece, y con suerte te será útil.

Y como desea SELECCIONAR antes de la ACTUALIZACIÓN, puede modificar el sql dinámico como en el enlace que publiqué, para hacer primero SELECCIONAR.

0

No estoy seguro de entender las limitaciones de su situación, pero puedo no basta con ejecutar dos instrucciones a la vez, como por ejemplo:

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

¿Una función almacenada ser una opción? Puede llamarlos de forma más fluida (al menos en MySQL) que los procedimientos almacenados: en lugar de "llamar a PROCEDURE_NAME (x)", puede usar "SELECT FUNCTION_NAME (x)".

0

Mi conjetura con el XP es que escribirías tu propio XP para hacer la actualización e incluirla en la consulta de alguna manera. Si esto funcionará o no, y en qué parte de la consulta debería ir para que se ejecute antes de que SQL vea tus datos, me supera.

Parece que has probado casi todo lo que probaría. Lo siento por ti porque probablemente sería bastante fácil actualizar el estado después de que ejecutaste la selección.

Cuestiones relacionadas