![]() |
Datenbank: MSSQL • Version: 2000 • Zugriff über: /
Resultset einer Stored Procedure extern filtern
In Bezug auf
![]() Ich hab jetzt eine Stored Procedure erstellt, die mir für ein gegebenes Datum eine Liste aller Artikel mit zu dem Zeitpunkt gültigem Datum gibt. Die Stored Procedure klappt an sich wunderbar. Nur, wie kann ich diese SP jetzt von aussen aufrufen, und noch zusaätzliche Filterbedingungen einbringen, wie z.B. nur Artikel mit einer Artikelnummer > irgendwas. Hier mal die SP:
SQL-Code:
Der Aufruf
CREATE procedure spArtikelPreise (@Datum datetime, @EKVK int, @LanguageCode varchar(3))
as if @Datum is null begin set @Datum = dbo.Datum(getdate()) end if @EKVK is null begin set @EKVK = 1 end if @LanguageCode is null begin set @LanguageCode = 'D' end SELECT dbo.Artikel.id AS AR_ID, dbo.Preise.id AS PR_ID, dbo.Artikel.ArtikelNr AS AR_Nr, round(dbo.Preise.Preis/dbo.Preise.Menge,2) AS PR_Preis, dbo.Preise.Datum AS PR_Datum, dbo.Preise.EKVK AS PR_EKVK, dbo.Language.Code AS L_Code, dbo.ArtikelBezeich.BezeichnungKurz, dbo.ArtikelBezeich.BezeichnungLang FROM dbo.Artikel INNER JOIN dbo.Preise ON dbo.Artikel.ArtikelNr = dbo.Preise.fiArtikel INNER JOIN dbo.ArtikelBezeich ON dbo.Artikel.ArtikelNr = dbo.ArtikelBezeich.fiArtikel INNER JOIN dbo.Language ON dbo.ArtikelBezeich.Sprache = dbo.Language.ID INNER JOIN ( SELECT fiArtikel, ISNULL(MAX(Datum), dbo.Datum(@Datum)) AS Datum, EKVK FROM dbo.Preise WHERE (Datum <= @Datum) GROUP BY fiArtikel, EKVK HAVING (MAX(Datum) <= @Datum) ) pt ON dbo.Preise.fiArtikel = pt.fiArtikel AND dbo.Preise.Datum = pt.Datum AND dbo.Preise.EKVK = pt.EKVK WHERE (dbo.Preise.Datum < @Datum) and pt.EKVK = @EKVK and dbo.Language.Code = @LanguageCode ORDER BY dbo.Artikel.id
SQL-Code:
klappt.
exec spArtikelPreise null,null,null
Ich suche was wie
SQL-Code:
Das klappt so natürlich nicht, aber Ihr wisst was ich meine.
select * from (exec spArtikelPreise null,null,null) where AR_Nr > '10000'
|
Re: Resultset einer Stored Procedure extern filtern
OK, kompliziert, aber ich hab eine ineffektive Lösung gefunden... Ineffektiv deshalb, weil trotzdem zuerst alle Artikel ermittelt werden, und erst anschliessen die WHERE Clause greift.
Stichwort: Functions im SQL Server. Damit kann man die skurilsten Dinge anstellen:
SQL-Code:
-- Author : Tom Peiffer
-- -- Diese Funktion liefert eine Artikelliste mit dem korrekten Preis zu angegebenem Datum. Es muss angegeben werden, ob -- der EK Preis (0) oder der VK Preis (1) ausgegeben werden soll. Die Sprache der Artikelbezeichnung muss -- mit angegeben werden (bislang 'D' oder 'F') -- Wenn Null in einen Parameter angegeben wird, so wird der Default Wert genommen. Für Datum muss ein Wert angegeben werden -- Für Datum klappt getdate() nicht da getdate in Funktionen nicht angewendet werden dürfen -- -- INPUT : @Datum : Das Datum, für das der Preis übernommen werden soll -- @EKVK : 0 = EK ; 1 = VK (defaul = 1) -- @LanguageCode : 'D' oder 'F' für die Sprache der Bezeichnung Kurz und Bezeichnung Lang (default = 'D') -- OUTPUT : Resultset mit allen Artikeln. -- USE : select * from dbo.ArtikelPreise('2005-01-01',1,'D') where AR_Nr > '20000' CREATE FUNCTION dbo.ArtikelPreise (@Datum datetime, @EKVK int, @LanguageCode varchar(3)) RETURNS @ArtikelPreise TABLE(AR_ID int, PR_ID int, AR_Nr varchar(50), PR_Preis float, PR_Datum datetime, PR_EKVK int, L_Code varchar(3), BezeichnungKurz varchar(80), BezeichnungLang varchar(500)) AS BEGIN if @EKVK is null begin set @EKVK = 1 end if @LanguageCode is null begin set @LanguageCode = 'D' end INSERT @ArtikelPreise SELECT dbo.Artikel.id AS AR_ID, dbo.Preise.id AS PR_ID, dbo.Artikel.ArtikelNr AS AR_Nr, round(dbo.Preise.Preis/dbo.Preise.Menge,2) AS PR_Preis, dbo.Preise.Datum AS PR_Datum, dbo.Preise.EKVK AS PR_EKVK, dbo.Language.Code AS L_Code, dbo.ArtikelBezeich.BezeichnungKurz, dbo.ArtikelBezeich.BezeichnungLang FROM dbo.Artikel INNER JOIN dbo.Preise ON dbo.Artikel.ArtikelNr = dbo.Preise.fiArtikel INNER JOIN dbo.ArtikelBezeich ON dbo.Artikel.ArtikelNr = dbo.ArtikelBezeich.fiArtikel INNER JOIN dbo.Language ON dbo.ArtikelBezeich.Sprache = dbo.Language.ID INNER JOIN ( SELECT fiArtikel, ISNULL(MAX(Datum), dbo.Datum(@Datum)) AS Datum, EKVK FROM dbo.Preise WHERE (Datum <= @Datum) GROUP BY fiArtikel, EKVK HAVING (MAX(Datum) <= @Datum) ) pt ON dbo.Preise.fiArtikel = pt.fiArtikel AND dbo.Preise.Datum = pt.Datum AND dbo.Preise.EKVK = pt.EKVK WHERE (dbo.Preise.Datum < @Datum) and pt.EKVK = @EKVK and dbo.Language.Code = @LanguageCode RETURN END |
Re: Resultset einer Stored Procedure extern filtern
Jelly, das ist doch alles viel zu kompliziert. Die Prozedur aus dem anderen Thread kann ich auch mit einer Tabelle joinen, z.B. so :
SQL-Code:
Und dabei wird definitiv eine Ergebnismenge zurückgeliefert. Guck mal besser in der Richtung. Das Bsp. ist auch als solches angesehen. Ich wollte nur für einen anderen Fall diy Syntax testen. Wenn da jetzt richtige Parameter gesetzt werden und geeignete Where-Klauseln, dann muß das so gehen.
SELECT DISTINCT EAP.PREIS FROM artpg AP JOIN
ERMITTLEARTPREISSP8 (1906,3,'01.01.2006') EAP ON AP.ID_ART < 1906 |
Re: Resultset einer Stored Procedure extern filtern
@Hansa: Was ist denn bei Dir ERMITTLEARTPREISSP8, wenn nicht eine eigene Funktion. An deinem Code ist daher nichts anders als an meinem, oder überseh ich da was.
|
Re: Resultset einer Stored Procedure extern filtern
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
SQL-Code:
Wenn ich das auf die Schnelle richtig sehe, wird da allerdings noch zuviel zurückgeliefert. 8) Das muß noch eingegrenzt werden, aber mir fällt jetzt nach langem Tag nicht ein wie genau.
SELECT P.*, A.*,TP.* FROM art8 A,PREIS8 P, TESTPREISSP8 (:DATUM,:ID_ART) TP
WHERE (P.ID_ART = A.ID) ORDER BY ABDATUM DESC Zitat:
Egal, die DB hängt hier dran (mit Test-Datendef.). Für Micky-SQL gibts ja wohl auch so was wie IBExpert. Ist denn hier keiner, der sich mit den ganzen Klammeraffen auskennt ? :shock: Das kann doch kaum noch viel sein. |
Re: Resultset einer Stored Procedure extern filtern
Hansa, danke für die Mühe, aber mein Problem ist ja mittlerweilen gelöst.
Meine Funktion/Stored Procedure ist deshalb länger, weil da noch ein paar andere Tabellen mit einfliessen. Die Ausführdauer ist minimal, und das bei 10000 Artikel, von denen es in den nächsten 10 Jahren auch nur unwesentlich mehr werden. Meine Lösung klappt, mehr brauchts ja nicht. OT: ich mag das Wort Mickysoft nicht... Der SQL Server schlägt jeden Firebird/Interbase Server um Längen in jedem Performance Test. Deswegen Microsoft durch den Dreck zu ziehen halt ich für nicht gerade angebracht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz