FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Realizar un MERGE con los ADOConnection
Buenas,
Estoy intentando realizar un MERGE a una tabla en un servidor MSSQL a traves de los componentes ADO, en particular la consulta es
Pero siempre obtengo el error "Sintaxis incorrecta cerca de la palabra 'merge'" He intentado ejecutarlo desde los componentes ADOCommandText, ADOQuery y directamente ejecutandolo con el ADOConnection.Execute siempre con el mismo resultado. Dicha instrucción SQL es correcta y si la ejecuto en la aplicación Microsoft SQL Server Management Studio, se ejecuta sin problemas y obtengo los resultados esperados de inserción/actualización. Esta consulta es en MSSQL es equivalente a hacer en MySQL un
Comentar que estoy usando Delphi XE4, de servidor de datos MSSQL2005 y la conexión al servidor la realizo directamente a través de SQL NATIVE CLIENT. También he intentando ejecutar dicha consulta con los componentes ZEOS, pero el resultado nuevamente ha sido el mismo. Me da la impresión que el error al darlo en español lo este generando el SQL NATIVE CLIENT, pero ya lo actualice a la ultima versión del mismo, sin obtener ningún cambio. Y buscando en google sobre este error tampoco he obtenido resultados. Gracias anticipadas por su ayuda. |
#2
|
|||
|
|||
En general este tipo de sentencias de actualización no puede ejecutarse con el procedimiento "open" de un dataset o estableciendo "Active" a true, por lo que casi nunca se pueden ejecutar en tiempo de diseño. Con ADO asegúrate de estar utilizando el método TADOQuery.ExecSQL en el código de la aplicación.
Por otra parte, si mal no recuerdo, la sentencia merge está disponible desde la versión SQL Server 2008. Me sorprende que funcione en SQL Server 2005. Última edición por orodriguezca fecha: 27-11-2014 a las 14:54:02. |
#3
|
|||
|
|||
Hola orodriguezca, gracias por responder
En cuanto al servidor tenias razón, es la versión 2008, "Microsoft SQL Server 2008 (RTM) - 10.0.1600.22", es por eso que podía hacer el merge En cuanto a este tipo de sentencias, es cierto que no se pueden ejecutar con un SQLQuery, pero puestos a que no he conseguido ponerlo a funcionar ya he probado con todo :-). La forma de ExecSQL es de lo poco que me quedaba, pero no ha funcionado tampoco. Originalmente se deberia de ejecutar de esta forma, muy similar al ExecSQL, pero directamente sobre el componente CONNECTION, y la ejecución siempre sera en RUNTIME, dentro de un proceso de intercambio de datos con otras tablas. Código:
try ADOConnection1.Execute( 'merge STOCKS as target' + 'using (values (''X3'', ''03'', ''2014-11-27'', ''SA123'', 3)) as source' + '(EMPRESA,ALMACEN,FECHA,ARTICULO,UNIDADES) on ' + ' target.empresa= source.empresa and ' + ' target.almacen=source.almacen and ' + ' target.fecha=source.fecha and ' + ' target.articulo=source.articulo and ' + 'when matched then ' + ' update ' + ' set UNIDADES = source.UNIDADES ' + 'when not matched then ' + ' insert (EMPRESA,ALMACEN,FECHA,ARTICULO,UNIDADES)' + ' values (' + ' source.EMPRESA,' + ' source.ALMACEN,' + ' source.FECHA,' + ' source.ARTICULO,' + ' source.UNIDADES' + ' );' ); except On E:Exception do begin MessageDlg(E.Message, mtError, [mbOK], 0); end; end; ¿Hay alguna forma de evitar este analisis previo y que le llegue al motor de BD?? para que en caso de error sea el propio motor el que de el error |
#4
|
|||
|
|||
Debería funcionar bien. Asegúrate que la aplicación se está conectando al servidor correcto. Hice una prueba con ADO y funcionó correctamente. Esto fue lo que hice:
Así establecí la cadena de conexión:
En ADOQuery1.SQL (En tiempo de diseño):
Y como Acción:
|
#5
|
|||
|
|||
Revisando un poco más en detalle tu código creo que el problema puede estar en la concatenacion:
Al concatenar la cadena quedaría como
Coloca al menos un espació al final de cada literal de cadena:
|
#6
|
|||
|
|||
Gracias orodriguezca por tus respuestas.
Finalmente ya conseguí que funcionara, parece ser que se trataba de un problema de versiones del SQLNCLI, pues tenia instalada la versión 9 (necesaria para un programa de terceros) y la versión 10. He desinstalado ambas versiones y las he vuelto a instalar. Y ya si he conseguido que funcione. Es cierto que el tema de los espacios en el corte de la sentencia era un error, pues no había espacio entre el final de linea y el siguiente, pero es que anteriormente no llegaba a marcar ni siquiera ese error a nivel sintáctico. Después de algún tiempo haciendo intentos y de buscar información al respecto estaba ya por buscar soluciones alternativas a este problema, pensando que pudiera tratarse de un BUG del proveedor de datos. Gracias de nuevo por tu ayuda y tu tiempo. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Merge Module Firebird | mjjj | Firebird e Interbase | 5 | 29-01-2008 14:15:27 |
InstallShield y BDE Merge Module | manitoba | Varios | 0 | 14-03-2007 19:02:50 |
Mail Merge con Word | JavierSotillos | Varios | 0 | 20-10-2006 12:19:43 |
merge mail | PiPerraK | Varios | 4 | 30-08-2005 16:53:11 |
Merge Modules son necesarios? | m@r | Varios | 2 | 14-01-2005 16:08:20 |
|