Såhär blev min sp, efter diverese F1 i sql. sparken heter 'cursor', men det är nästan alltid fel lösning Beskriv vad du vill göra så kan vi komma med alterantiv. Cursors kan du se exempel på i [Någon som har en effektivare lösning än den här?] , men som johan säger, man måste ha gått långt innan man behöver dom (om inte låg utvecklingstid prioriteras framför prestanda)... Beskriv vad jag vill göra.. my god men.. ser ni inte det i första alternativet.. ;) Typ du ska modifiera data. Du säger inte på vilket sätt. Eller beskriver hur du vill förändra den. Problemet är att du (alla ni som nämner cursors) tänker procedurellt. SQL är inget procedurellt språk, det är set-baserat. Som Andreas säger, exakt vad vill du göra? Något sånt här kanske ger dig en spark i rätt riktning:Behöver hjälp med tänket kring en SP. [ LÖST ]
Eftersom jag var på en tänkande stadium ( inte samma som kod stadium) så kunde jag inte specificera mig mer än som jag gjort nedanför.
Tack för sparkarna i cursor riktningen och tack CH för dina exempel.
Såhär blev det tillslut (Jag är inte sql expert, men det funkar) :)
<code>
CREATE PROC Sp_UpdateReciveSupplier
@RowNumber int, @Delivered decimal,
@DeliveredNow decimal, @DeliveryNote int, @Date_ datetime, @EndDelivered int, @LineNumber numeric
AS
SET NOCOUNT ON
DECLARE @LastChanged datetime, @ProdNumber varchar(20), @Level_ int, @Reference varchar(20), @Number varchar(20),
@ItemNumber varchar(20), @Quantity decimal, @Date__ datetime, @AcceptBy int, @StockLock varchar(10),
@CreditorAccount varchar(10), @ShowOnWeb int, @DataSet varchar(3),
@RowNumber_ int
DECLARE supplier_cursor CURSOR
FOR SELECT DATASET, ROWNUMBER, LASTCHANGED, PRODNUMBER, LEVEL_, REFERENCE, NUMBER_, ITEMNUMBER, QTY, ACCEPTBY, STOCKLOCK, CREDITORACCOUNT, DATE_, SHOWONWEB
FROM dbo.ERECIVED
WHERE ROWNUMBER = @RowNumber
OPEN supplier_cursor
FETCH NEXT FROM supplier_cursor
INTO @DataSet, @RowNumber_, @LastChanged, @ProdNumber, @Level_, @Reference, @Number, @ItemNumber, @Quantity, @AcceptBy, @StockLock, @CreditorAccount, @Date__, @ShowOnWeb
INSERT INTO dbo.ERECIVED (DATASET, ROWNUMBER, LASTCHANGED, PRODNUMBER, LEVEL_, REFERENCE, NUMBER_, ITEMNUMBER, QTY, DELIVERED, DELIVEREDNOW, ENDDELIVERED, DATE_, DELIVERYNOTE, ACCEPTBY, STOCKLOCK, CREDITORACCOUNT, WEBCREATED, SHOWONWEB, LINENO_)
VALUES (@DataSet, @RowNumber_, @LastChanged, @ProdNumber, @Level_, @Reference, @Number, @ItemNumber, @Quantity, @DeliveredNow, @Delivered, @EndDelivered, @Date__, @DeliveryNote, @AcceptBy, @StockLock, @CreditorAccount, '1', @ShowOnWeb, @LineNumber)
UPDATE dbo.ERECIVED SET DELIVERED = @DeliveredNow, Date_ = @Date_
WHERE ROWNUMBER = @RowNumber
FETCH NEXT FROM supplier_cursor
INTO @DataSet, @RowNumber_, @LastChanged, @ProdNumber, @Level_, @Reference, @Number, @ItemNumber, @Quantity, @AcceptBy, @StockLock, @CreditorAccount, @Date__, @ShowOnWeb
CLOSE supplier_cursor
DEALLOCATE supplier_cursor
GO
</code>
Fungerar utmärkt på 1 rad som skall uppdateras och ja... många många många rader... Tipsa mig gärna på hur denna kan göras effektivare.Sv: Behöver hjälp med tänket kring en SP.
när man måste ta till en cursor i en SP.
Om det gåt att lösa med tex en uppdatering baserad på en join
är det mycket bättre.
/johan/Sv: Behöver hjälp med tänket kring en SP.
Sv: Behöver hjälp med tänket kring en SP.
Sv: Behöver hjälp med tänket kring en SP.
Skall kolla på cursors..
tack för "hjälpen".. Sv: Behöver hjälp med tänket kring en SP.
Så nej det är omöjligt att ens försöka gissa vad du vill åstakomma med din data. Om duskulle avslöjat det kanske vi skulle kunna föreslå en lösning som är betydlit effektivare och snyggare.
Men om du inte vill det. Så är det inte vårt problem.Sv: Behöver hjälp med tänket kring en SP.
update foo
set a = bar.b
from foo f
inner join bar b on f.c = bar.d
where bar.e = @foobar
Detta är iofs inte riktigt ANSI standard eller speciellt snyggt, men det fungerar mycket bättre än en cursor. Du kanske klarar dig med en vanlig:
UPDATE foo
SET a = @foobar
WHERE b = (SELECT c FROM bar WHERE d = @xyz)