Billy Pang
tuxedo_man at hotmail.com
Fri Jul 16 16:24:58 CDT 2004
Hi Shamil: I didn't think it was possible anyways. I was really racking my brain trying to figure out it out. I had first concluded it was not possible. However, it is always more prudent to ask peers in same field of work for second opinion. This was a good thread :) Sincerely, Billy >From: "Shamil Salakhetdinov" <shamil at users.mns.ru> >Reply-To: dba-sqlserver at databaseadvisors.com >To: dba-sqlserver at databaseadvisors.com >Subject: Re: [dba-SQLServer] tsql help - propogate that pk >Date: Sat, 17 Jul 2004 00:23:32 +0400 > > > If SQL Server is able to immitate this behavior (without > > using scope_identity(), of course :) ), then I am would > > like to know. >Billy, > >I think it can't - sorry I can't help here. > >Shamil > >----- Original Message ----- >From: "Billy Pang" <tuxedo_man at hotmail.com> >To: <dba-sqlserver at databaseadvisors.com> >Sent: Saturday, July 17, 2004 12:05 AM >Subject: Re: [dba-SQLServer] tsql help - propogate that pk > > > > Hi Shamil: > > > > The sentence from BOL is absolutely correct. But it does not give me >what I > > want; I need to have "identity" values moved from one table to another >after > > a view insert. There is no doubt that a view can update multiple base > > tables; there is no question about that; and it is possible to >reference > > them unambigiously; however, the fact that it is an "instead of >insert", it > > is not possible to reference any identity values generated from the >view > > (without using scope_identity()). This would not be a problem if it >was > > possible to create an "After" trigger on a view. > > > > And yes, it works eloquently in Access. For demonstration purposes, >within > > Access, create two tables with following schema: > > > > tablea > > tablea_id autonumber > > tablea_value text(50) > > > > tableb > > tableb_id autonumber > > tableb_tablea_id number long > > tableb_value text(50) > > > > then create a query called qryInsert with the following source: > > > > SELECT tablea.tablea_id, tableb.tableb_id, tablea.tablea_value, > > tableb.tableb_value, tableb.tableb_tablea_id, tablea.tablea_id > > FROM tablea INNER JOIN tableb ON tablea.tablea_id = >tableb.tableb_tablea_id; > > > > then create and execute the following query: > > > > insert into qryInsert(tablea_value, tableb_value) values('a','b') > > > > followed by: > > > > insert into qryInsert(tablea_value, tableb_value) > > select tablea_value, tableb_value > > from qryInsert > > > > and again.. > > > > insert into qryInsert(tablea_value, tableb_value) > > select tablea_value, tableb_value > > from qryInsert > > > > and you will find four records in tablea as expected, four records in >tableb > > as expected and all four records in tablea have related records in >tableb. > > > > Access was able to do this without any database triggers. And Access >was > > able to accommodate "view inserts" that have SELECT as source. If SQL > > Server is able to immitate this behavior (without using >scope_identity(), of > > course :) ), then I am would like to know. > > > > Kindest regards, > > Billy > > > > >From: "Shamil Salakhetdinov" <shamil at users.mns.ru> > > >Reply-To: dba-sqlserver at databaseadvisors.com > > >To: dba-sqlserver at databaseadvisors.com > > >Subject: Re: [dba-SQLServer] tsql help - propogate that pk > > >Date: Fri, 16 Jul 2004 22:22:25 +0400 > > > > > >Billy, > > > > > >What about that sentence from BOL?: > > > > > >"SQL Server 2000 > > >Updatable views can modify more than one table involved in the view. >The > > >DELETE, INSERT, and UPDATE statements can reference a view as long as > > >SQL Server can translate the user's update request unambiguously to > > >updates in the base tables referenced in the view's definition. > > >Expect differences in behavior when working with updatable views with > > >more than one table involved in the DELETE, INSERT, or UPDATE > > >statements." > > > > > > > I was actually hoping for a solution that is > > > > quite simple > > >For me the solution looks simple. I called it tricky only because >it's > > >not obvious when starting to work with instead of triggers. > > >You can also use a simple stored procedure to fullfill your task... > > > > > > > the view insert (where it > > > > affects multiple tables) works eloquently in MS Access but not in >Sql > > > > Server. > > >Are you sure it will work in MS Access for your task? (This question >is > > >not an invitation to MS Access vs. MS SQL2000 discussion) > > > > > >Shamil > > > > > >----- Original Message ----- > > >From: "Billy Pang" <tuxedo_man at hotmail.com> > > >To: <dba-sqlserver at databaseadvisors.com> > > >Sent: Friday, July 16, 2004 3:18 AM > > >Subject: Re: [dba-SQLServer] tsql help - propogate that pk > > > > > > > > > > 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&S >U=http://hotmail.com/enca&HL=Market_MSNIS_Taglines > > > > > > > > _______________________________________________ > > > > dba-SQLServer mailing list > > > > dba-SQLServer at databaseadvisors.com > > > > http://databaseadvisors.com/mailman/listinfo/dba-sqlserver > > > > http://www.databaseadvisors.com > > > > > > > > > >_______________________________________________ > > >dba-SQLServer mailing list > > >dba-SQLServer at databaseadvisors.com > > >http://databaseadvisors.com/mailman/listinfo/dba-sqlserver > > >http://www.databaseadvisors.com > > > > > > > _________________________________________________________________ > > MSN Premium helps eliminate e-mail viruses. 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 > > > > _______________________________________________ > > dba-SQLServer mailing list > > dba-SQLServer at databaseadvisors.com > > http://databaseadvisors.com/mailman/listinfo/dba-sqlserver > > http://www.databaseadvisors.com > > > >_______________________________________________ >dba-SQLServer mailing list >dba-SQLServer at databaseadvisors.com >http://databaseadvisors.com/mailman/listinfo/dba-sqlserver >http://www.databaseadvisors.com > _________________________________________________________________ STOP MORE SPAM with the MSN Premium and 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