OK, muchas gracias por el ejemplo. La semana que viene lo pruebo. --- El sáb 5-sep-09, Alfonso Arias Lemas <[email protected]> escribió:
De: Alfonso Arias Lemas <[email protected]> Asunto: [dbms] Consulta sobre Query Para: [email protected] Fecha: sábado, 5 de septiembre de 2009, 5:41 pm Hola Patricia, esa pregunta la lance hace unos dias en esta lista y en GUFA y respondieron lo siguiente: Sigue el hilo que ahí te explican mas o menos como hacer; ******************************************************* ----- Mensaje reenviado ---- De: "Alejandro, Newbery" <[email protected]> Para: GUFA List Member <[email protected]> Enviado: jueves, 27 de agosto, 2009 12:44:48 Asunto: [GUFA] [GUFA] Pasar una tabla como parámetro a un procedimiento almacenado MSSQL???? No, no lo convierte automáticamente, el SP seria mas o menos asi: CREATE PROCEDURE Ins_RemitoVentas ( @remitoid char(15), -- Aqui irian todos los demas parametros de la cabecera @detalle xml, AS begin set nocount on -- declare variables declare @iHandleXml int declare @iReturn int -- inicializo xml document exec @iReturn = sp_xml_preparedocument @iHandleXml output, @detalle if @iReturn != 0 begin raiserror('No se pudo obtener un controlador válido para el documento xml proporcionado.', 16, 1) return(1) end begin try begin tran -- Primero insertas la cabecera insert into RemitoVentas( remitoid, ....demas campos) values( @remitoid, ....demas parámetros) -- Aqui agregarias el detalle desde el xml insert into RemitoVentasDetalle( itemid, remitoid, productoid, cdadremit) select itemid, @remitoid, productoid, cdadremit from openxml(@ihandlexml, '/VFPDataSet/detalle', 2) with ( itemid char(15), productoid char(15), cdadremit numeric(18, 6)) commit tran exec sp_xml_removedocument @iHandleXml end try begin catch exec sp_xml_removedocument @iHandleXml -- roll back la transaction. rollback transaction -- Despues del apropiado rollback, envio -- información del error. set @ErrorMessage = ERROR_MESSAGE(); raiserror(@ErrorMessage, -- Message text. 16, -- Severity. 1 -- State. ) return(1) end catch end GO El comando que utilizas desde SQL es OPENXML, la salida la tratas como una tabla normal. Lo unico que debes tener en cuenta cuando generas el parámetro XML desde VFP (con cursortoxml() o xmladapter mi preferido), es el nombre del alias, ya que el tag de tabla lo arma con ese nombre en el XML. Eso es lo que debes poner en OPENXM(@ihandlexml, '/VFPDataSet/nombre_de_alias_en_minusculas', 2). Espero te sirva. Saludos, Alejandro. Nota: el ejemplo que te escribi arriba es en sql2005/2008. Esta técnica también funciona en 2000, pero el control de errores es diferente ya que no contas con trycatch. De: [email protected] [mailto:[email protected]] En nombre de Alfonso Arias Lemas Enviado el: Jueves, 27 de Agosto de 2009 10:12 a.m. Para: GUFA List Member Asunto: [GUFA] Re: [GUFA] RE: [GUFA] Re: [GUFA] RE: [GUFA] Pasar una tabla como parámetro a un procedimiento almacenado MSSQL???? ok Alejandro ese es el caso que yo tengo, es una factura con sus items, voy a estudiarme lo del parámetro XML Mas me dices que cuando lo toma es SP automaticamente lo convierte en una tabla???? Saludos, Alfonso De: "Alejandro, Newbery" <[email protected]> Para: GUFA List Member <[email protected]> Enviado: jueves, 27 de agosto, 2009 10:51:18 Asunto: [GUFA] RE: [GUFA] Re: [GUFA] RE: [GUFA] Pasar una tabla como parámetro a un procedimiento almacenado MSSQL???? La forma mas eficiente y simple es pasar un parémetro de tipo XML, dentro del SP lo lees como si fuese una tabla más. Seria un caso tipico de maestro detalle, por ejemplo una Factura y sus items. Saludos Alejandro. De: [email protected] [mailto:[email protected]] En nombre de Alfonso Arias Lemas Enviado el: Miércoles, 26 de Agosto de 2009 09:49 p.m. Para: GUFA List Member Asunto: [GUFA] Re: [GUFA] RE: [GUFA] Pasar una tabla como parámetro a un procedimiento almacenado MSSQL???? Hola Jose, Lo que quiero hacer es parecido a cuando hago un insert de un registro en MSSQL utilizando un procedimiento almacenado que transfiero por ejemplo sólo los valores de los campos y el procedimiento se encarga del resto y de las validaciones. Eso mismo pero en vez de transferir valores de un sólo registro poder transferir la tabla completa, del resto de las validaciones se encarga el procedimiento almacenado. Todo esto para garantizar que la transacción se termine de forma efectiva porque me ha pasado que utilizando SQLSETPROP(m.HCONEXION,'Transactions',2) && Transacción manual si no llega al final del SQLCOMMIT o de SQLROLLBACK y el sistema se bloquea o termina de forma anormal antes de concluir no se actualizan todas las tablas en MSSQL . Saludos, Alfonso De: Jose Paez <[email protected]> Para: GUFA List Member <[email protected]> Enviado: miércoles, 26 de agosto, 2009 0:41:16 Asunto: [GUFA] RE: [GUFA] Pasar una tabla como parámetro a un procedimiento almacenado MSSQL???? Hola Alfonso Solo por curiosidad, ¿ Estás intentando crear un procedimiento almacenado que sea dinamico en la consulta de tablas ? Algunas experiencias he realizado sobre el tema. Saludos José Paez Date: Mon, 24 Aug 2009 22:01:11 +0000 From: [email protected] Subject: [GUFA] [GUFA] Pasar una tabla como parámetro a un procedimiento almacenado MSSQL???? To: [email protected] Hola gente de la lista, Será posible pasarle a un procedimiento almacenado de MSSQL una tabla o cursor como parámetro???? Saludos, Alfonso start: 0000-00-00 end: 0000-00-00 De: Patricia Banfi <[email protected]> Para: Alfonso Arias Lemas <[email protected]> Enviado: viernes, 4 de septiembre, 2009 19:11:42 Asunto: [dbms] Consulta sobre Query Hola, En sql 2005 necesito hacer un sp que inserte la cabecera y los items de un documento, y al mismo tiempo descuente la cantidad de cada item del stock. Ningún programa debe poder consultar/actualizar el stock mientras se está realizando esta operación. Se me ocurre que tengo que pasar los items en formato XML y usar with (tablockx) pero no tengo claro cómo sacar los datos del xml y si usar tablockx es correcto. Agradecería mucho alguna sugerencia o link al respecto. Patricia Encontra las mejores recetas con Yahoo! Cocina. http://ar.mujer.yahoo.com/cocina/ Yahoo! Cocina Encontra las mejores recetas con Yahoo! Cocina. http://ar.mujer.yahoo.com/cocina/
