You are here: Re: Synchronous Bulk-Copy into two table « MsSQL Server « IT news, forums, messages
Re: Synchronous Bulk-Copy into two table

Posted by Erland Sommarskog on 05/30/07 21:47

Khafancoder (khafancoder@gmail.com) writes:
> i finally decided to disable identity insertion and do the copy
> operation by using temporary Map tables which maps Old Ids and New Ids
> so :
> --------------------------------------------------------------------
> CREATE TABLE #MapProducts (SourceProductId bigint, DestProductId
> bigint)
>
> INSERT INTO #MapProducts (SourceProductId, DestProductId)
> SELECT ProductId, CASE WHEN
> ((SELECT COUNT(*) FROM #MapProducts) > 0) THEN (SELECT
> MAX(DestProductId) + 1 FROM #MapProducts)
> ELSE (SELECT MAX(ProductId) + 1 FROM Products) END
> FROM Products WHERE StoreId=@SourceStoreId
> --------------------------------------------------------------------
>
>
> but another problem, this line :
> --------------------------------------------------------------------
> CASE WHEN ((SELECT COUNT(*) FROM #MapProducts) > 0) THEN (SELECT
> MAX(DestProductId) + 1 FROM #MapProducts)
> --------------------------------------------------------------------
> won't be executed because sql engine calculate COUNT before do the
> insert operation.
>
> how could i solve that ?
> is it possible to force INSERT command to calculate COUNT after
> inserting *each record* ?

That won't fly, as you have noticed. You need to compute the new
id:s from what is given before you start inserting. And this should
not be impossible. Please review this piece of code, which is the
same I posted a couple of days back:

BEGIN TRANSACTION

SELECT @newstoreid = colaesce(MAX(storeid), 0) + 1
FROM Stores WITH (UPDLOCK)

INSERT Stores (StoredId, StoreName)
VALUES(@newstoreid, @newstorename)

SELECT @maxprodid = MAX(ProductId) FROM Products
SELECT @minoldprodid = MIN(ProductId)
FROM Stores
WHERE StoredId = @oldstoreid

INSERT Products (ProductId, StoreId, ProductName, ProductDescription)
SELECT @maxprodid + 1 + @minprodid - ProductId, @newstoreid,
ProductName, ProductDescription
FROM Products
WHERE StoreId = @oldstoreid

SELECT @maxpartid = MAX(PartId) FROM Parts
SELECT @minpartid = MIN(Pa.PartId)
FROM Parts Pa
JOIN Products Pr ON Pa.ProductId = Pr.ProductID
WHERE Pr.StoreID = @oldstoreid

INSERT Parts(PartId, ProductId, Partname)
SELECT @maxpartid + 1 + @minpartid - Pa.PartId,
@maxprodid + 1 + @minprodid - Pr.ProductId, Pa.Partname
FROM Parts Pa
JOIN Products Pr ON Pa.ProductId = Pr.ProductID
WHERE Pr.StoreID = @oldstoreid

COMMIT TRANSACTION



--
Erland Sommarskog, SQL Server MVP, esquel@sommarskog.se

Books Online for SQL Server 2005 at
http://www.microsoft.com/technet/prodtechnol/sql/2005/downloads/books.mspx
Books Online for SQL Server 2000 at
http://www.microsoft.com/sql/prodinfo/previousversions/books.mspx

 

Navigation:

[Reply to this message]


Удаленная работа для программистов  •  Как заработать на Google AdSense  •  England, UK  •  статьи на английском  •  PHP MySQL CMS Apache Oscommerce  •  Online Business Knowledge Base  •  DVD MP3 AVI MP4 players codecs conversion help
Home  •  Search  •  Site Map  •  Set as Homepage  •  Add to Favourites

Copyright © 2005-2006 Powered by Custom PHP Programming

Сайт изготовлен в Студии Валентина Петручека
изготовление и поддержка веб-сайтов, разработка программного обеспечения, поисковая оптимизация