[dba-SQLServer] tsql help - propogate that pk

Billy Pang tuxedo_man at hotmail.com
Thu Jul 15 18:18:59 CDT 2004


Thanks Shamil for your time.  I was actually hoping for a solution that is 
quite simple (perhaps I was overlooking something very obvious).  I thought 
that there was a more simple solution because the view insert (where it 
affects multiple tables) works eloquently in MS Access but not in Sql 
Server.

Regards,
Billy




>From: "Shamil Salakhetdinov" <shamil at users.mns.ru>
>Reply-To: dba-sqlserver at databaseadvisors.com
>To: "dba-SQLServer" <dba-SQLServer at databaseadvisors.com>
>Subject: Re: [dba-SQLServer] tsql help - propogate that pk
>Date: Fri, 16 Jul 2004 02:32:23 +0400
>
>Hi Billy,
>
>You didn't ask about inserting several rows using instead of insert
>trigger, did you? :)
>
>Well, I think it can be done without cursors but we have to assume that
>there is no UNIVERSAL solution for such a case - I mean that for each
>certain case the cursor-less solution with instead of triggers could
>have quite different implementation - as always in programming an
>"optimal" solution is a balance of interests, a compromise:
>
>So if we assume that when several rows are inserted against my sample
>view then this means that:
>
>1. they all belong to one order
>2. product name is unique
>
>Then one of the the solutons is:
>
>- insert all rows into tblProduct from inserted if there is no yet such
>product,
>- insert one row into tblOrder from inserted,
>- insert all rows into tblOrdItem from inserted joined to tblProduct on
>ProdName
>
>See SQL script in P.S. of this message.
>
>If you need something more complicated - e.g. inserting several orders
>against view like in the current sample avoiding cursors' usage by all
>means - if you need that - then you're welcome to hire me to do that and
>other tricky work! :)
>
>HTH,
>Shamil
>
>P.S. Solution:
>
>
>CREATE TRIGGER [qselInsert] ON [dbo].[qselOrder]
>INSTEAD OF INSERT
>AS
>declare @ordID int
>
>Set NoCount On
>
>-- /////////////////////////////////////////////////
>Insert Into [dbo].[tblProduct]
>(
>    [prodName]
>  , [prodCurPrice]
>)
>select
>    prodName
>  , prodCurPrice
>from inserted where (prodName not in (select prodName from tblProduct))
>
>-- /////////////////////////////////////////////////
>Insert Into [dbo].[tblOrder]
>(
>    [ordDate]
>  , [custId]
>  , [ordCurTotal]
>)
>select top 1
>    ordDate
>  , custId
>  , ordCurTotal
>from inserted
>
>Set @ordID = Cast(SCOPE_IDENTITY() As [int])
>-- /////////////////////////////////////////////////
>Insert Into [dbo].[tblOrderItem]
>(
>    [ordId]
>  , [prodId]
>  , [oitAmount]
>)
>select
>    @ordId
>  , p.prodId
>  , oitAmount
>from inserted i inner join tblProduct p on i.prodName = p.prodName
>-- /////////////////////////////////////////////////
>
>Set NoCount Off
>----- Original Message -----
>From: "Billy Pang" <tuxedo_man at hotmail.com>
>To: <dba-sqlserver at databaseadvisors.com>
>Sent: Friday, July 16, 2004 1:18 AM
>Subject: Re: [dba-SQLServer] tsql help - propogate that pk
>
>
> > Hi Shamil:
> >
> > Thanks for your assistance.  Your solution will only work based on the
> > assumption that records can only be inserted into tblOrder one at a
>time; if
> > insert statement for tblOrder table has "select" as source, then the
> > tblorderid fk in tblorderitem table may contain incorrect value.
> >
> > Using below example as example, execute the following insert
>statements:
> >
> > <--- cut here --->
> > insert into qselOrder(ordDate, custId, ordCurTotal, prodName,
>prodCurPrice,
> > oitAmount)
> > values(getdate(),1,2,'product name',4,5)
> >
> > insert into qselOrder(ordDate, custId, ordCurTotal, prodName,
>prodCurPrice,
> > oitAmount)
> > select ordDate, custId, ordCurTotal, prodName, prodCurPrice, oitAmount
>from
> > qselOrder
> >
> > insert into qselOrder(ordDate, custId, ordCurTotal, prodName,
>prodCurPrice,
> > oitAmount)
> > select ordDate, custId, ordCurTotal, prodName, prodCurPrice, oitAmount
>from
> > qselOrder
> > <--- cut here --->
> >
> > assuming tblorder table is empty from very beginning, it will insert
>four
> > records into tblorder table as expected and four records into
>tblorderitems
> > table as expected.  however, the fourth record in tblorder table does
>not
> > have any related records in tblorderitems.
> >
> > One way around this problem is to load the values within the
>"inserted"
> > pseudo table into a table variable (assuming ss2k) or temporary table
>and
> > loop through them using database cursor.  However, I am wondering if
>there
> > is another way.
> >
> > sincerely,
> > Billy
> >
>
>_______________________________________________
>dba-SQLServer mailing list
>dba-SQLServer at databaseadvisors.com
>http://databaseadvisors.com/mailman/listinfo/dba-sqlserver
>http://www.databaseadvisors.com
>

_________________________________________________________________
Add photos to your e-mail with MSN Premium. Get 2 months FREE*  
http://join.msn.com/?pgmarket=en-ca&page=byoa/prem&xAPID=1994&DI=1034&SU=http://hotmail.com/enca&HL=Market_MSNIS_Taglines




More information about the dba-SQLServer mailing list