sql server - conditional update/insert in sql -
i have stored procedure updating/inserting data being read xml. see in xml data under itemresults, there multiple (2 in case) items. want item values changed should updated. in stored procedure takes value of first item default. item value changed @ runtime. whatever no. of items added user (in case of new items being added), should saved database.
the xml data:
<?xml version="1.0" encoding="utf-16"?> <saveorder xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:xsd="http://www.w3.org/2001/xmlschema"> <orderid>10511</orderid> <rowid>0</rowid> <employeeid>0</employeeid> <orderdate>4/18/1997</orderdate> <shipvia>0</shipvia> <freight>0</freight> <contactname>laurence lebihan</contactname> <phone>91.24.45.40</phone> <itemcount>0</itemcount> <orderresults> <orders> <orderid>10511</orderid> <rowid>68</rowid> <customerid>bonap</customerid> <employeeid>4</employeeid> <orderdate>4/18/1997</orderdate> <requireddate>5/16/1997</requireddate> <shippeddate>5/16/1997</shippeddate> <shipvia>3</shipvia> <freight>420</freight> <shipname>bon app'</shipname> <shipaddress>12, rue des bouchers</shipaddress> <shipcity>marseille</shipcity> <shipregion /> <shippostalcode>13008</shippostalcode> <shipcountry>france</shipcountry> <companyname>bon app'</companyname> <contactname>laurence lebihan</contactname> <phone>91.24.45.40</phone> <itemcount>3</itemcount> <itemresults> <items> <orderid>10511</orderid> <productid>4</productid> <unitprice>22.0000</unitprice> <quantity>50</quantity> <discount>0.15</discount> </items> <items> <orderid>10511</orderid> <productid>7</productid> <unitprice>30.0000</unitprice> <quantity>50</quantity> <discount>0.15</discount> </items> <items> <orderid>10511</orderid> <productid>8</productid> <unitprice>40.0000</unitprice> <quantity>10</quantity> <discount>0.15</discount> </items> </itemresults> </orders> </orderresults> </saveorder> the stored procedure: alter procedure [dbo].[usp_updateorderdetail]
@request xml = '<request/>'--, --@response xml = '<response/>' output begin declare @orderid int declare @productid nvarchar(50) set @orderid = @request.value('(saveorder/orderid)[1]', 'int') if @orderid > 0 begin update customers set contactname = t.c.value('(contactname/text())[1]', 'nvarchar(30)'), phone = t.c.value('(phone/text())[1]', 'nvarchar(24)') --orderdate = t.c.value('orderdate[1]', 'varchar(50)') @request.nodes('/saveorder/orderresults/orders') t(c) customerid = t.c.value('(customerid/text())[1]', 'nchar(5)') update orders set orderdate = t.c.value('(orderdate/text())[1]', 'datetime'), requireddate = t.c.value('(requireddate/text())[1]', 'datetime'), shippeddate = t.c.value('(shippeddate/text())[1]', 'datetime'), shipvia = t.c.value('(shipvia/text())[1]', 'int'), freight = t.c.value('(freight/text())[1]', 'money'), shipname = t.c.value('(shipname/text())[1]', 'nvarchar(40)'), shipaddress = t.c.value('(shipaddress/text())[1]', 'nvarchar(60)'), shipcity = t.c.value('(shipcity/text())[1]', 'nvarchar(15)'), shipregion = t.c.value('(shipregion/text())[1]', 'nvarchar(15)'), shippostalcode = t.c.value('(shippostalcode/text())[1]', 'nvarchar(10)'), shipcountry = t.c.value('(shipcountry/text())[1]', 'nvarchar(15)') @request.nodes('/saveorder/orderresults/orders') t(c) orderid = @orderid update [order details] set unitprice = t.c.value('(unitprice/text())[1]', 'money'), quantity = t.c.value('(quantity/text())[1]', 'smallint'), discount = t.c.value('(discount/text())[1]', 'real') @request.nodes('/saveorder/orderresults/orders/itemresults/items') t(c) orderid = @orderid end else begin insert customers (contactname, phone) select t.c.value('(contactname/text())[1]', 'nvarchar(30)'), t.c.value('(phone/text())[1]', 'nvarchar(24)') @request.nodes('/saveorder/orderresults/orders') t(c) insert orders( orderdate, requireddate, shippeddate , shipvia , freight , shipname , shipaddress , shipcity , shipregion , shippostalcode , shipcountry ) select t.c.value('(orderdate/text())[1]', 'datetime'), t.c.value('(requireddate/text())[1]', 'datetime'), t.c.value('(shippeddate/text())[1]', 'datetime'), t.c.value('(shipvia/text())[1]', 'int'), t.c.value('(freight/text())[1]', 'money'), t.c.value('(shipname/text())[1]', 'nvarchar(40)'), t.c.value('(shipaddress/text())[1]', 'nvarchar(60)'), t.c.value('(shipcity/text())[1]', 'nvarchar(15)'), t.c.value('(shipregion/text())[1]', 'nvarchar(15)'), t.c.value('(shippostalcode/text())[1]', 'nvarchar(10)'), t.c.value('(shipcountry/text())[1]', 'nvarchar(15)') @request.nodes('/saveorder/orderresults/orders') t(c) insert [order details] (unitprice , quantity, discount) select t.c.value('(unitprice/text())[1]', 'money'), t.c.value('(quantity/text())[1]', 'smallint'), t.c.value('(discount/text())[1]', 'real') @request.nodes('/saveorder/orderresults/orders/itemresults/items') t(c) end declare @counter int set @counter = 1
Comments
Post a Comment