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

Popular posts from this blog

c# - Operator '==' incompatible with operand types 'Guid' and 'Guid' using DynamicExpression.ParseLambda<T, bool> -