Agregar varios Registros (Encabezado y detalle) en un Store Procedure

30/09/2008 - 03:37 por Edgar Ortiz | Informe spam
Necesito agregar el encabezado de una Factura y su detalle en una sola
transaccion utilizando un store procedure.

Me surgen dos dudas:
1- Cual es el LARGO maximo de una variable tipo caracter?
2- COmo hago para hacer un ciclo y obtener los datos que vienen como
parametros?

Ejemplo:

SP_Agrega_Factura (Fac_Numero, Detalle)

Fac_Numero = 123
Detalle = '111,1,50.25,222,1,100.00,333,1.5,25'
Donde esto significarian TRES (3) registros a agregar:
Registro: 1
Articulo = 111
Cantidad = 1
Precio = 50.25

Registro: 2
Articulo = 222
Cantidad = 1
Precio = 100.00

Registro: 3
Articulo = 333
Cantidad = 1.5
Precio = 25

Gracias de antemano por su tiempo

Saludos,

Edgar Ortiz

Preguntas similare

Leer las respuestas

#1 Jesús López
30/09/2008 - 14:20 | Informe spam
SQL Server 2000, 2005 o 2008?

Yo creo que lo más adecuado para hacer eso es pasarle al procedimiento
almacenado un documento XML con todos los datos, luego dependiendo de la
versión de SQL trataría el XML de una forma u otra.

CREATE PROCEDURE AgregarFactura
@factura <xml, text, ntext, varchar(8000) ... depende de la version>
AS

BEGIN TRAN
.

INSERT INTO CabeceraFactura
SELECT
FROM <aquí es distinto por cada version>

INSERT INTO DetallesFactura
SELECT
FROM <aqui es disitinto por cada version>


Además, para dar una solución completa sería necesario tener los scripts de
creación de las tablas.



"Edgar Ortiz" escribió en el mensaje
news:
Necesito agregar el encabezado de una Factura y su detalle en una sola
transaccion utilizando un store procedure.

Me surgen dos dudas:
1- Cual es el LARGO maximo de una variable tipo caracter?
2- COmo hago para hacer un ciclo y obtener los datos que vienen como
parametros?

Ejemplo:

SP_Agrega_Factura (Fac_Numero, Detalle)

Fac_Numero = 123
Detalle = '111,1,50.25,222,1,100.00,333,1.5,25'
Donde esto significarian TRES (3) registros a agregar:
Registro: 1
Articulo = 111
Cantidad = 1
Precio = 50.25

Registro: 2
Articulo = 222
Cantidad = 1
Precio = 100.00

Registro: 3
Articulo = 333
Cantidad = 1.5
Precio = 25

Gracias de antemano por su tiempo

Saludos,

Edgar Ortiz



Respuesta Responder a este mensaje
#2 Pedro
30/09/2008 - 21:44 | Informe spam
Si es SQL 2008 ya existen los parametros tipo tabla.


"Edgar Ortiz" escribió en el mensaje
news:
Necesito agregar el encabezado de una Factura y su detalle en una sola
transaccion utilizando un store procedure.

Me surgen dos dudas:
1- Cual es el LARGO maximo de una variable tipo caracter?
2- COmo hago para hacer un ciclo y obtener los datos que vienen como
parametros?

Ejemplo:

SP_Agrega_Factura (Fac_Numero, Detalle)

Fac_Numero = 123
Detalle = '111,1,50.25,222,1,100.00,333,1.5,25'
Donde esto significarian TRES (3) registros a agregar:
Registro: 1
Articulo = 111
Cantidad = 1
Precio = 50.25

Registro: 2
Articulo = 222
Cantidad = 1
Precio = 100.00

Registro: 3
Articulo = 333
Cantidad = 1.5
Precio = 25

Gracias de antemano por su tiempo

Saludos,

Edgar Ortiz



Respuesta Responder a este mensaje
#3 Edgar Ortiz
01/10/2008 - 04:42 | Informe spam
Gracias por tu tiempo, es la version SQL 2000


"Jesús López" wrote in message
news:%
SQL Server 2000, 2005 o 2008?

Yo creo que lo más adecuado para hacer eso es pasarle al procedimiento
almacenado un documento XML con todos los datos, luego dependiendo de la
versión de SQL trataría el XML de una forma u otra.

CREATE PROCEDURE AgregarFactura
@factura <xml, text, ntext, varchar(8000) ... depende de la version>
AS

BEGIN TRAN
.

INSERT INTO CabeceraFactura
SELECT
FROM <aquí es distinto por cada version>

INSERT INTO DetallesFactura
SELECT
FROM <aqui es disitinto por cada version>


Además, para dar una solución completa sería necesario tener los scripts
de creación de las tablas.



"Edgar Ortiz" escribió en el mensaje
news:
Necesito agregar el encabezado de una Factura y su detalle en una sola
transaccion utilizando un store procedure.

Me surgen dos dudas:
1- Cual es el LARGO maximo de una variable tipo caracter?
2- COmo hago para hacer un ciclo y obtener los datos que vienen como
parametros?

Ejemplo:

SP_Agrega_Factura (Fac_Numero, Detalle)

Fac_Numero = 123
Detalle = '111,1,50.25,222,1,100.00,333,1.5,25'
Donde esto significarian TRES (3) registros a agregar:
Registro: 1
Articulo = 111
Cantidad = 1
Precio = 50.25

Registro: 2
Articulo = 222
Cantidad = 1
Precio = 100.00

Registro: 3
Articulo = 333
Cantidad = 1.5
Precio = 25

Gracias de antemano por su tiempo

Saludos,

Edgar Ortiz







Respuesta Responder a este mensaje
#4 Jesús López
01/10/2008 - 14:11 | Informe spam
Como aún no has proporcionado DDLs para todas las tablas el ejemplo que te
puedo poner es incompleto, quizá sería mejor ponerlo para un pedido de la
base de datos Northwind ya que es bastante similar:

Este sería el procedimiento almacenado:

CREATE PROCEDURE AddOrder
@Order text, @OrderID int out
AS
BEGIN
DECLARE @Error int, @RowCount int

BEGIN TRANSACTION

DECLARE @doc int
EXEC sp_xml_preparedocument @doc out, @Order

INSERT INTO Orders(CustomerID, EmployeeID, OrderDate, ShipVia)
SELECT CustomerID, EmployeeID, OrderDate, ShipVia
FROM OPENXML(@doc, '/Order', 1)
WITH (
CustomerID nchar(5),
EmployeeID int,
OrderDate datetime,
ShipVia int
)

SELECT @OrderID = SCOPE_IDENTITY(),
@RowCount = @@ROWCOUNT,
@Error = @@ERROR

IF @Error <> 0 GOTO ErrorHandler


IF @RowCount > 1
BEGIN
RAISERROR('Solo se permite añadir un pedido cada vez', 16, -1)
GOTO ErrorHandler
END


INSERT INTO [Order Details](OrderID,ProductID,UnitPrice,Quantity)
SELECT @OrderID, ProductID, UnitPrice, Quantity
FROM OPENXML(@doc, '/Order/OrderDetail', 1)
WITH (
ProductID int,
Quantity smallint,
UnitPrice money
)

SELECT @RowCount = @@ROWCOUNT,
@Error = @@ERROR

IF @Error <> 0 GOTO ErrorHandler

EXEC sp_xml_removedocument @doc
COMMIT
RETURN

ErrorHandler:
EXEC sp_xml_removedocument @doc
ROLLBACK
RETURN

END

GO

DECLARE @OrderID int
EXEC AddOrder '
<Order CustomerID="ALFKI" EmployeeID="2" OrderDate="20081001" ShipVia="3">
<OrderDetail ProductID="2" Quantity="10" UnitPrice="19.0"/>
<OrderDetail ProductID="57" Quantity="20" UnitPrice="23.5"/>
</Order>',
@OrderID OUT
SELECT @OrderID AS OrderID



Y esto es un ejemplo de ejecución:

DECLARE @OrderID int

EXEC AddOrder '
<Order CustomerID="ALFKI" EmployeeID="2" OrderDate="20081001" ShipVia="3">
<OrderDetail ProductID="2" Quantity="10" UnitPrice="19.0"/>
<OrderDetail ProductID="57" Quantity="20" UnitPrice="23.5"/>
</Order>',
@OrderID OUT


SELECT @OrderID AS OrderID





"Edgar Ortiz" escribió en el mensaje
news:
Gracias por tu tiempo, es la version SQL 2000


"Jesús López" wrote in message
news:%
SQL Server 2000, 2005 o 2008?

Yo creo que lo más adecuado para hacer eso es pasarle al procedimiento
almacenado un documento XML con todos los datos, luego dependiendo de la
versión de SQL trataría el XML de una forma u otra.

CREATE PROCEDURE AgregarFactura
@factura <xml, text, ntext, varchar(8000) ... depende de la version>
AS

BEGIN TRAN
.

INSERT INTO CabeceraFactura
SELECT
FROM <aquí es distinto por cada version>

INSERT INTO DetallesFactura
SELECT
FROM <aqui es disitinto por cada version>


Además, para dar una solución completa sería necesario tener los scripts
de creación de las tablas.



"Edgar Ortiz" escribió en el mensaje
news:
Necesito agregar el encabezado de una Factura y su detalle en una sola
transaccion utilizando un store procedure.

Me surgen dos dudas:
1- Cual es el LARGO maximo de una variable tipo caracter?
2- COmo hago para hacer un ciclo y obtener los datos que vienen como
parametros?

Ejemplo:

SP_Agrega_Factura (Fac_Numero, Detalle)

Fac_Numero = 123
Detalle = '111,1,50.25,222,1,100.00,333,1.5,25'
Donde esto significarian TRES (3) registros a agregar:
Registro: 1
Articulo = 111
Cantidad = 1
Precio = 50.25

Registro: 2
Articulo = 222
Cantidad = 1
Precio = 100.00

Registro: 3
Articulo = 333
Cantidad = 1.5
Precio = 25

Gracias de antemano por su tiempo

Saludos,

Edgar Ortiz











Respuesta Responder a este mensaje
#5 Maxi Accotto
04/10/2008 - 02:49 | Informe spam
Hola, como te han comentado lo mejor en tu caso seria usar XML aunque en
2000 no exista podrias emularlo en un text y luego aplicar openxml

Aca te paso un hermoso link donde muestra como pasar array a store
procedures, espero te sea de utilidad:

http://www.sommarskog.se/arrays-in-sql.html


Saludos
Maxi Accotto
Microsoft MVP en SQLServer
SQltotalconsulting
-

"Edgar Ortiz" escribió en el mensaje de
noticias:
Necesito agregar el encabezado de una Factura y su detalle en una sola
transaccion utilizando un store procedure.

Me surgen dos dudas:
1- Cual es el LARGO maximo de una variable tipo caracter?
2- COmo hago para hacer un ciclo y obtener los datos que vienen como
parametros?

Ejemplo:

SP_Agrega_Factura (Fac_Numero, Detalle)

Fac_Numero = 123
Detalle = '111,1,50.25,222,1,100.00,333,1.5,25'
Donde esto significarian TRES (3) registros a agregar:
Registro: 1
Articulo = 111
Cantidad = 1
Precio = 50.25

Registro: 2
Articulo = 222
Cantidad = 1
Precio = 100.00

Registro: 3
Articulo = 333
Cantidad = 1.5
Precio = 25

Gracias de antemano por su tiempo

Saludos,

Edgar Ortiz



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida