SQL Server : rekursive update-Anweisung
Ich bin etwas neu auf SQL, und ich versuche herauszufinden, der beste Weg, dies zu tun, ohne hardcoding update-Anweisungen in SQL Server 2012.
Grundsätzlich habe ich eine hierarchische Tabelle der Unternehmen (denken Sie an eine supply chain) mit Spalten (CompanyID, ParentID, ParentPriceAdj, CompanyPriceAdj
). Jedes Unternehmen zugewiesen bekommt, eine Preisanpassung durch Ihre Eltern, die änderung einer Liste mit Preis in PartMaster
Tisch-und Endpreis wird berechnet durch Kaskadierung der Einstellungen von Eltern auf das Kind.
Wenn ein Eltern Preisanpassung aktualisiert wird, möchte ich, dass zu reflektieren, auf alle seine Kind Unternehmen und so weiter
aka:
Beim Update CompanyPriceAdj
für einen bestimmten updatedcompanyID
will ich rekursiv alle finden das Kind CompanyID
's (ParentId = updatedCompanyID
) und aktualisieren Sie Ihre ParentPriceAdj
zu ParentCompany
's (parentPriceAdj * (1 + CompanyPriceAdj)
)
CompanyId ParentID ParentPriceAdj CompanyPriceAdj
5 6 0.96 .10
6 8 1 .20
7 6 0.96 .15
8 11 1 0
10 6 0.96 0
11 12 1 0
Dachte ich an die Verwendung einer gespeicherten Prozedur, die updates dann wiederholt sich für jedes Kind, das wurde gerade aktualisiert und anschließend aktualisiert seinen Kindern.... bis die Gesellschaft hat keine Kinder
Habe ich habe versucht, um konnte keine Beispiele wie diese
Dies ist, was ich jetzt haben
ALTER PROCEDURE [dbo].[UpdatePricing]
@updatedCompanyID int, @PriceAdj decimal
AS
BEGIN
SET NOCOUNT ON;
WHILE (Select CompanyID From CompanyInfo Where ParentID = @updatedCompanyID) IS NOT NULL
UPDATE CompanyInfo
SET ParentPriceAdj = @PriceAdj * (1+CompanyPriceAdj),
@updatedCompanyId = CompanyID,
@PriceAdj = CompanyPriceAdj
WHERE ParentID = @updatedCompanyID
--- some method to call itself again for each (@updatedCompanyID, @PriceAdj)
END
Du musst angemeldet sein, um einen Kommentar abzugeben.
Rekursiver CTE kann verwendet werden, um zu Fuß Hierarchie, so etwas wie:
Können Sie MIT expression in t-sql zu bekommen, alle übergeordneten Datensätze für bestimmtes Kind aufnehmen. Und aktualisieren jeden Datensatz in der Datensatz entsprechend deiner Logik.
Hier sind links für MIT Ausdruck --
http://msdn.microsoft.com/en-us/library/ms175972.aspx
http://msdn.microsoft.com/en-us/library/ms186243(v=sql.105).aspx
Haben Sie sich bei der Verwendung eines CURSORS? Es ist ein bisschen Aufwand, aber es kann Sie geben, was Sie brauchen. Im Falle Sie nicht vertraut sind, finden Sie unten einen grundlegenden überblick. Es erlaubt Ihnen, ziehen Sie jede Firma ID ein zu einer Zeit, nehmen Sie Ihre änderungen vor, und bewegen auf. Sie können verschachteln Sie Sie, schließen Sie in Schleifen oder fügen-Schleifen in Ihnen, was Sie brauchen, zu gehen durch eine Liste mit Aktionen, bis es sind keine weiteren Maßnahmen Links, die Aufmerksamkeit benötigen.
Hoffe, das ist hilfreich. Ich entschuldige mich, wenn ich falsch verstanden habe.