Hej Borde vara enklare att lösa i kod/rapportgeneratorn. Eller något dylikt (inte testat, men liknande bör fungera): HejStored procedures
Jag har ett litet problem
En av våra tabeller (vi kan kalla den artiklar) ser ut ungefär så här
Radnr;ArtikelID,ProduktNamn,Antal
För varje artikel finns det helt enkelt en rad i databasen
Jag skulle vilja skapa en stored procedure som returnerar en tabell där det fanns lika många artikelrader som det aktuella antalet var för just den artikeln (Om jag har flera artiklar så skall även dessa vecklas ut)
Exempel
1;1001A04;"Vinkeljärn";5
då skulle resultatet blir
1;1001A04;"Vinkeljärn";5
2;1001A04;"Vinkeljärn";5
3;1001A04;"Vinkeljärn";5
4;1001A04;"Vinkeljärn";5
5;1001A04;"Vinkeljärn";5
Observera dock att jag inte vill att resultatet skall sparas eller något liknande, det används endast vid rapporthantering nämligen.
Är det någon som har ett förslag eller tips på hur man kan lägga upp detta?
/MarkusSv: Stored procedures
Men annars, ett förslag är att du i din SP skapar en temp-tabell
declare @tmp table (radnr int, text varchar(100))
Sen använder du en cursor för att snurra igenom grunddatat och skapar de rader du vill i @tmp tabell
genom att villkora och loopa
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_de-dz_31yq.asp
sist väljer du resultatet som du skapade i @tmp
( select * from @tmp ..... order by .. ) Sv: Stored procedures
CREATE PROCEDURE GET_ARTICLE
(
@artID varchar(10)
)
AS
DECLARE @amount int
DECLARE @count int
SET @count = 1
SET @amount = SELECT Antal FROM artiklar WHERE ArtikelID = @artID
WHILE @count <= @amount
BEGIN
SELECT CAST(@count AS varchar(10)) + ';' + ArtikelID + ';' + ProduktNamn + ';' + CAST(Antal as varchar(10)) FROM Artiklar WHERE ArtikelID = @artID
@count = @count + 1
END
Sv: Stored procedures
Tack för era inlägg och speciellt länken till MS den var guld värd
så här blev proceduren i alla fall
tyvärr så tar den 60% CPU kraft i ca 1 minut och 40 sekunder
misstänker att det beror på att de två tabellerna är väldigt stora
har dock försökt göra vissa urval som skall minska ned resultatet
om någon av er känner till ett sätt att öka hastigheten mer eller ser något direkt programmeringsmisstag så får ni gärna komma med förslag
/*
Proceduren utvecklad av Markus Bengtsson
Skapad 2006-08-03
Rev: 1.0
Ändrad av:
Syfte:
Procedurens syfte är att hämta selekterade orderrader och att returnera en ny tabell med
alla artikelrader utvecklade baserat på antalet beställda artiklar på ordern
*/
CREATE PROCEDURE dbo.sp_label_test
AS
DECLARE @label_SalesNumber varchar(10)
DECLARE @label_QtyOrdered decimal(28,12)
DECLARE @label_ItemNumber varchar(20)
DECLARE @label_Nobbnr varchar(20)
DECLARE @label_Eannr varchar(20)
DECLARE @label_Finfonr varchar(20)
DECLARE @label_ItemName varchar(40)
DECLARE @tmp TABLE (
rownumber decimal(28,12),
tmp_SalesNumber varchar(10),
tmp_QtyOrdered decimal(28,12),
tmp_ItemNumber varchar(20),
tmp_Nobbnr varchar(20),
tmp_Eannr varchar(20),
tmp_Finfonr varchar(20),
tmp_ItemName varchar(40))
SET NOCOUNT ON
DECLARE label_cursor CURSOR FOR
SELECT
dbo.SalesTrans.SalesNumber,
dbo.SalesTrans.QTYORDERED,
dbo.StockTable.ItemNumber,
dbo.StockTable.NOBBNR,
dbo.StockTable.EANNR,
dbo.StockTable.FINFONR,
dbo.StockTable.ItemName
FROM
dbo.SalesTrans
INNER JOIN dbo.StockTable ON
dbo.Stocktable.DataSet = dbo.SalesTrans.DataSet and
dbo.StockTable.ItemNumber = dbo.SalesTrans.ItemNumber
WHERE
(dbo.SalesTrans.DataSet = 'DOR') AND
(dbo.SalesTrans.CreateDate > '2005-01-01 00:00:000') and
(len(dbo.Stocktable.NOBBNR) > 1 or
len(dbo.Stocktable.EANNR) >1 or
len(dbo.Stocktable.FINFONR)>1 ) and
(dbo.StockTable.PStruct = 0)
OPEN label_cursor
FETCH NEXT FROM label_cursor
INTO @label_SalesNumber,
@label_QtyOrdered,
@label_ItemNumber,
@label_Nobbnr,
@label_Eannr,
@label_Finfonr,
@label_ItemName
DECLARE @counter_2 decimal(28, 12)
WHILE @@FETCH_STATUS = 0
BEGIN
SET @counter_2 = 1
while @counter_2 <= @label_QtyOrdered
BEGIN
INSERT INTO @tmp
VALUES
(@counter_2,
@label_SalesNumber,
@label_QtyOrdered,
@label_ItemNumber,
@label_Nobbnr,
@label_Eannr,
@label_Finfonr,
@label_ItemName)
SET @counter_2 = @counter_2+1
END
FETCH NEXT FROM label_cursor
INTO @label_SalesNumber,
@label_QtyOrdered,
@label_ItemNumber,
@label_Nobbnr,
@label_Eannr,
@label_Finfonr,
@label_ItemName
END
CLOSE label_cursor
DEALLOCATE label_cursor
select * from @tmp
return
GO
mvh
Markus Bengtsson