Pregunta

Lo siento por la longitud de este, estoy tratando de dar un montón de información para evitar soluciones no pertinentes.

Mi objetivo es incorporar al menos 1 instrucción UPDATE en una instrucción SELECT de modo que tenga la oportunidad de actualizar algunos valores calculados en el instante antes de que los seleccionados se ejecuta la instrucción (pensar en él como un disparador en SELECT). VIEW no está en solución inmediata, ya que estoy obligado por el sistema que estoy usando (véase más adelante).

Estoy personalizar un ERP commerical tercera parte que es débil en las características (sistema permanecerá sin nombre - resultado es que no han oído hablar de él, pero no es de cosecha propia tampoco). Cuenta con un centro de consulta en lata en el que puedo utilizar un texto / GUI para crear una consulta SELECT. Una vez puedo guardar una consulta, los usuarios pueden hacer clic en la consulta para ejecutarlo y ver los resultados. ERP se ejecuta encima de MS SQL Server 2000; actualización de la versión no está en las tarjetas en este momento. Puedo escribir lo que el conjunto de características que necesito fuera de la ERP en el idioma que yo quiero, yo he hecho esto en el pasado, si las características justifiquen. Pero mi comunidad de usuarios le resulta más fácil cuando mis personalizaciones se pueden hacer en el sistema ERP.

La consulta puede ser arbitrariamente compleja, pero el paquete ERP construye 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 que el SQL es válida cuando se combinan como anteriormente.

Me parece que no puede encontrar un encantamiento para ejecutar un procedimiento almacenado como un efecto secundario de una instrucción SELECT, ya sea en el selecto cláusula, dónde, etc. Realmente no importa cómo me jailbreak al sistema - - un ataque de inyección SQL estable estaría bien, con tal de que no quería decir que tenía que modificar la seguridad del propio servidor SQL subyacente. He mirado en las UDF, pero no se puede poner una instrucción UPDATE en una UDF escalar, y que no tiene sentido tratar de modificar el retorno de una UDF de tabla (o no?). Si usted puede actualizar desde una vista, entonces me gustaría ver un ejemplo, pero me doy cuenta de que puedo utilizar una vista para calcular las columnas y que no es la solución que estoy buscando. He leído un comunicado en línea sugerente acerca de ser capaz de utilizar algún tipo de xp_ de lograr esto, pero en cuanto a que xp_ o cómo hacerlo, no sé.

Esta pregunta no es una solución, en sí mismo: actualización de una tabla dentro de una instrucción de selección

¿Fue útil?

Solución

No puedo pensar en ninguna manera de combinar un SELECT con un UPDATE en SQL 2000 (aunque en el año 2005 en adelante, la cláusula de salida está disponible). Sin embargo, parece que se obtiene tres valores de cadena (fieldList, tableListAndJoins, whereCond) que quedan concatenados con "SELECT", "DE" y "dónde", y suponiendo que no hacen algo de detección de código SQL injenction-como 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 usted va a volver dos conjuntos de datos. El primero será un conjunto vacío de una columna (alias que NULL si desea un nombre a la columna), y los datos que desea será en el segundo set. Otras soluciones temporales podrían ser posibles, dependiendo de cómo se utilizan estos tres valores y cómo se capturan los errores. (Deje que la primera consulta generar y error, y la esperanza de la actualización y la segunda consulta pasan por?)

Otros consejos

Trate de usar SQL dinámico en el procedimiento almacenado como que figura en la última respuesta aquí

Vinculado por lo que el autor original puede obtener los créditos que él / ella se merece, y se espera que sea útil para usted.

Y ya que usted quiere SELECT antes de la actualización, se puede modificar el SQL dinámico como en el enlace que he publicado, para hacer el primer SELECT.

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

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

¿Una función almacenada ser una opción? Puede llamar a los más sin problemas (en MySQL al menos) que los procedimientos almacenados -. En lugar de "llamar PROCEDURE_NAME (x)" sólo puede utilizar "SELECT FUNCTION_NAME (x)"

Mi conjetura con el XP es que debería escribir su propio XP para hacer la actualización e incluirlo en la consulta de alguna manera. Sea o no que iba a funcionar y donde en la consulta que debe ir de manera que se puede ejecutar antes de que SQL mira a sus datos están totalmente más allá de mí.

Parece que usted ha intentado casi todo me gustaría probar. Lo siento por ti, ya que probablemente sería más fácil de actualizar el estado después que ejecutó la selección.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top