Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

μπωρω να εκτελέσω μια 2η stored procedure μεσα απο μια αλλαη και να επιστρεψει τιμη σε πεδιο της πρωτης?

Îåêßíçóå áðü ôï ìÝëïò Johnnyxp64. Τελευταία δημοσίευση από το μέλος Johnnyxp64 στις 29-01-2011, 18:27. Υπάρχουν 9 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  27-01-2011, 18:20 62721

    μπωρω να εκτελέσω μια 2η stored procedure μεσα απο μια αλλαη και να επιστρεψει τιμη σε πεδιο της πρωτης?

    καλησπερα

    συννεχεια στον γολγοθα των stored procedures Sad

    εχω ενα query που εχει ως που με 3 πεδια!
    τα 2 ειναι απο ενα πινακα αλλα το 3ο ειναι ενα πεδιο που θελω να παρει τιμες ΑΦΟΥ εκτελεστει μια αλλη function σε μια stored procedure και απο αυτη να παρω 1 μεταβλητη και να την εισάγω ως τιμη! πως το κανω αυτο???


    παραδειγμα

    sp1
    Select Id, Name, (execute 2nd SP here) AS Age




    sp2
    @dateofbirth as datetime

    current date - @dateofbirth 

    return result


    τελείως ψευδοκωδικας, εκτελω το 2SP στελνωντας 1 παραμετρο, την ημερ γεννησεις αυτο την περνει αφερει απο την σημερινη και θελω να επιστρέψει μια τιμη στο πρωτο sp μεσα στο column AGE!

    αυτο ειναι το γενικο σκεπτικο! μια 2 sp που θα κανει πολλες και διαφορες πραξεις (-+/*) αλλα θα επιστρεψει 1 αποτελεσμα! και αυτο να ειναι στο τελικο πεδιο μεσα οταν τρεξει το 1ο sp!

    πως μπορω να το κανω αυτο? γινεται?

    ευχαριστω.

    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  27-01-2011, 18:23 62722 σε απάντηση της 62721

    Απ: μπωρω να εκτελέσω μια 2η stored procedure μεσα απο μια αλλαη και να επιστρεψει τιμη σε πεδιο της πρωτης?

    Ο πιό εύκολος τρόπος να επιτύχεις αυτό που θέλεις είναι να χρησιμοποιήσεις inline scalar user defined functions (μην σε τρομάζει το όνομα, είναι πολύ απλές). 

    Δες εδώ (αλλά μην πας στις table-valued και μπερδευτείς, μόνο τις scalar): http://www.sqlteam.com/article/user-defined-functions


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  27-01-2011, 21:53 62731 σε απάντηση της 62722

    Απ: μπωρω να εκτελέσω μια 2η stored procedure μεσα απο μια αλλαη και να επιστρεψει τιμη σε πεδιο της πρωτης?

    xmmm πολλα υποσχόμενο μαλλον ειναι η λυση στο προβλημα μου....
    αυριο οταν γυρισω στο γραφειο θα το δοκιμάσω πρωι πρωι πανω στην βαση που "παιζω" σε ευχαριστώ!Big Smile

    ps Μονο το οτι την καλει με dbo.spname με αγχονει λιγο....δεν πρεπει να δωσω το "path" της βασεις? mydb.spname? μπορει να ρωταω και βλακεια αλλα δεν ξερω και ρωταω για να με σιγουρος.Smile

    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  28-01-2011, 00:48 62736 σε απάντηση της 62722

    Απ: μπωρω να εκτελέσω μια 2η stored procedure μεσα απο μια αλλαη και να επιστρεψει τιμη σε πεδιο της πρωτης?

    Μια διορθωση :  inline scalar user defined functions.
    Σε ολες τις εκδοσεις SQL Server μεχρι τωρα (2008 R2), δεν υπαρχουν "inline" scalar functions. Ολες οι scalar functions ειναι multistatement.

    --HTH--

     

  •  28-01-2011, 00:57 62737 σε απάντηση της 62736

    Απ: μπωρω να εκτελέσω μια 2η stored procedure μεσα απο μια αλλαη και να επιστρεψει τιμη σε πεδιο της πρωτης?

    Ναι, έχεις δίκιο. Εκ παραδρομής γράφτηκε, υπό την έννοια οτι μπορούν να χρησιμοποιηθούν inline στο εξωτερικό statement. Ομως, για να μην μπερδευτεί ο κόσμος με τις inline table-valued UDFs (που όντως υπάρχουν), ας βγάλουμε το inline από τον αρχικό ορισμό. Scalar UDFs it is.


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  28-01-2011, 12:23 62756 σε απάντηση της 62737

    Απ: μπωρω να εκτελέσω μια 2η stored procedure μεσα απο μια αλλαη και να επιστρεψει τιμη σε πεδιο της πρωτης?

    κατι πηγε να γινει αλλα αλλες απορειες ανεβηκαν στην επιφανεια

    πως μπορω να συνταξω το ακολουθω στο 1ο SP


    Set @query = 'SELECT customers.Name, customer.Phone, AGE AS (dbo.myscalarfunction('customers.birth')) from customers'
    
    EXECUTE sp_executesql @query

    δηλαδή να παρει την ημερομηνία κάπως την ωρα που εκτελείτε?



    ή ποιο "απλά" άλλη λύση 

    μπορω να φτιαξω ΟΧΙ στην βαση αλλα στην μνήμη μια μεταβλητή τύπου datatable (καπου το διαβασα ετσι)
    να φορτωσω μεσα της δεδομένα και μετα να κανω μια loop μεσα στις εγγραφές τις και να τρεξω για καθε εγγραφη την 2η function και αυτη με την σηρα της να προσθεση νεα πεδια στο πρωτο datatable με values οτι υπολογισε?

    παραδειγμα ψεβδοκωδικα (οπως περιπου ηταν σε παλιο προγραμα vb και πρεπει να γινει SP τωρα Angry)

    @query = 'Select Name, Phone, Born, space(10) as AGE from customers'
    @myDT DATATABLETYPE()
    set @myDT = execute @query
    
    declare @ageResult
    for i as integer = 0 tο @myDT.records.count -1
    	@myTD(i)("Age")=CurentDATE - @myTD(i)("Born")
    next i



    μπερδεμα......ε?
     ευχαριστω για τις προσπαθειες παιδια ελπιζω σε καποια λύση.....
    ανυπομωνω για τις προτασεις σας ωστε να γινει αυτο το ριμαδι!




    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  28-01-2011, 13:00 62757 σε απάντηση της 62756

    Απ: μπωρω να εκτελέσω μια 2η stored procedure μεσα απο μια αλλαη και να επιστρεψει τιμη σε πεδιο της πρωτης?

    Εχμ. Ομολογώ οτι δυσκολεύομαι να καταλάβω τι ακριβώς ζητάς. Μέσα σε ένα post έχεις αναμείξει δύο(?) ζητούμενα, ένα πιθανό τρόπο επίλυσης (ο οποίος όμως μπορεί να μην κάνει apply σε αυτό που πραγματικά θέλεις να κάνεις - εξαρτάται από το πόσο κατανοητό θα γίνει αυτό που θέλεις να επιτύχεις), και ψευδοκώδικα που κάνει "κάτι". 

    Αν αυτό το "κάτι" που θέλεις να κάνεις είναι τελικά απλά ένα date calculation βασισμένο σε πεδία ενός υπάρχοντα πίνακα, τότε τόσο ο τίτλος όλου του post όσο και η συζήτηση για sps και udfs μπορεί να μην έχει νόημα. Αν υποθέσουμε ότι όντως ο πίνακας ονομάζεται customers, υπάρχει ένα πεδίο born που καταχωρείται η ημ/νία γέννησης του πελάτη και εσύ θέλεις να βρίσκεις την τρέχουσα ηλικία του, μπορείς να το κάνεις ακόμα και με μια view ή με μια απλή SP, χρησιμοποιώντας την datediff και υπολογίζοντας τη διαφορά μεταξύ σημερινής ημ/νίας και ημ/νίας γέννησης. Π.χ.:

    SELECT Name, Phone, Born, DATEDIFF(YEAR,born, GETDATE()) as Age
    FROM Customers

    Θα σου φέρει την ηλικία (σε έτη) του κάθε πελάτη στο πεδίο Age. Αν και αυτό δεν είναι απόλυτα ορθό, μια και εγώ που είμαι γεννημένος 29/12/1973 θα εμφανιστώ σαν 38 ετών ενώ είμαι 37. Πιό ορθό θα ήταν:

    SELECT Name, Phone, Born, CONVERT(int,DATEDIFF(day,@born, GETDATE()) / 365) as Age
    FROM Customers

    Οπου υπολογίζω τη διαφορά σε μέρες, διαιρώ δια 365 (ή δια 360), και κάνω convert όλο το αποτέλεσμα σε integer. 

    Αν θέλω να έχω ακριβέστατο υπολογισμό ηλικίας βέβαια, πρέπει να υπολογίσω δίσεκτα κλπ, οπότε το πράγμα χοντραίνει.

    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  28-01-2011, 14:31 62760 σε απάντηση της 62757

    Απ: μπωρω να εκτελέσω μια 2η stored procedure μεσα απο μια αλλαη και να επιστρεψει τιμη σε πεδιο της πρωτης?

    οχι δεν ειναι το θεμα μια ηλικια
    απλα το παραδειγμα ηταν αυτο!(ατυχες μαλλον)

    οκ ας παμε σε κατι πραγματικα κοντα σε αυτο που πρεπει να γινει!

    καταρχας σορρυ για το μπερδεμα!

    θα παω στο τι θελουμε να ειναι το τελικο αποτελεσμα!

    θελουμε ενα grid με πεδια που μεσα θα εχει 10 στηλες!
    9 απο αυτες ειναι στανταρ και τα περνεις με ενα απλο select from where
    αλλα το αλλο 1 πρεπει να παρει τιμη ποιο δυναμικα, τιμη που θα προκειψει απο ενα αλλο select και loop!(φανταζομαι)

    περα απο την θεωρεια! το προβλημα ειναι:

    εχω μια βαση που εχει δωματια ξενοδοζειου σε ενα πινακα (Rooms)
    και εχω σε ενα αλλο πινακα τομοκαταλογο ανα season!!!! (SeasonPrices)
    τα δεδομενα και το structure του 2ου πινακα ειναι ως εξεις!

    RoomID-------SeasonStart-------------SeasonEnd-----------DayPrice
    666               1/7/2011                     30/7/2011              50
    666               1/8/2011                     30/8/2011              60
    333               1/7/2011                     30/7/2011              30
    333               1/8/2011                     30/8/2011              50


    ελπιζω μέχρι εδω να ειναι κατνοητο
    στο πρώτο query με τα 9 απλα columns εχουμε περασει και 2 ημ/νιες που ο πελατης θελει να ερθει και να φυγει απο το ξενοδοχειο!
    ετσι πολυ απλα σε πρωτη φαση βλεπουμε με ενα απλο where αν το δωματειο ειναι free τοτε,
    αλλα αυτο που δεν μπορω να κανω ειναι πως να μπορεσω την ωρα που ερχοντε τα 9 απλα πεδια να ερθει ακομα 1 ακομα το οποιο θα εχει ψαξει (φανταζομαι ενα αλλο 2 query sp) που θα φερενει στο τελος την ΣΥΝΟΛΙΚΗ τιμή των ημερων, βαση των ημερ/νιων που ζητησε ο πελατης!


    προσοχη στο πανω πίνακα ειναι τιμες ανα ημερα για εκεινει την περιοδο!
    αν εγω του δωσω παραμετρ ημ/νιες αφιξης και αναχρησεις που πιανει 2 ή περισοττρες περιοδους
    θελω για καθε μέρα (ας πουμε οτι ζητησα 1/7/2011 ως 15/8/2011) αρα περιπου 45μερες! πρεπει λοιπον καπως να δω πρωτα μια μια την καθε μερα σε ποια περιοδο ανοικει!
    μετα να παρω καπου στην μνημη σε μια μεταβλητη αυτη την τιμη και να παω στις επωμενες, και να αθροιζω τις τιμες ανα ημερα! ετσι στο τελος θα εχω 

    ολες τις τιμες ανα ημερα σε οποια περιοδο ανοικει η κρατηση μου και θα εχω αυτο το 1 δυναμικο comun με το SUM αυτων των τιμων στο τελικο grid!
    αυτο ειναι το project αυτο χρειαζομαι να βρω τροπο να κανω sp!!!!

    help!Sad

    p.s λιγο παραπλευρη ερωτησουλα αμα εχεις κανει ενα declare @Import table () και με ολα του τα πεδια ειναι οκ και με insert το γεμισες με δεδομενα ολα καλα.. πως στην ευχη το εμφανιζεις στο grid? πως το "εκτελεις" να πω δεν ξερω και ποια ειναι η ορολογια!????? Stick out tongue να δω αυτα τα δεδομενα θελω.

    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  29-01-2011, 00:39 62771 σε απάντηση της 62760

    Απ: μπωρω να εκτελέσω μια 2η stored procedure μεσα απο μια αλλαη και να επιστρεψει τιμη σε πεδιο της πρωτης?

    Το παρακατω ισως φανει χρησιμο.
    Σημειωση: Ο τροπος υπολογισμου της τιμης εξαρταται απο την εκαστοτε προσεγγιση/ιδιαιτεροτητα (πχ. χρεωση της ημερας αφιξης κ οχι της αναχωρησης, χρεωση κ των δυο, χρεωση της ημερας αναχωρισης κ οχι αφιξης, χρεωση της προηγουμενης ημερας οταν η αφιξη ειναι πριν τις 10 το πρωι κτλ).
    Το παραδειγμα παρακατω χρεωνει την ημερα αφιξης κ οχι την ημερα αναχωρησης, ανεξαρτητα απο την ωρα αφιξης.
    Αυτο που αξιζει να σημειωθει, ειναι οτι για τον υπολογισμο της τιμης, υπολογιζονται ολες οι ημερες μεταξυ checkin -checkout. Για καθε μερα, λαμβανεται η τιμη κ προστιθεται (SUM) με τις τιμες ολων των ημερων.
    Υπαρχει περιπτωση για μια συγκεκριμενη ημερα, να υπαρχουν δυο χρεωσεις (overlapping price periods per room) κ το παραδειγμα θα χρεωσει "διπλη, τριπλη κοκ" τιμη αναλογα με τον αριθμο των  περιοδων που αλληλο-επικαλυπτονται (σε αυτην την περιπτωση, μια πιθανη προσεγγιση θα ηταν να χρεωθει η πιο ακριβη τιμη).
    Οπως και να 'χει, το παραδειγμα δειχνει την προσεγγιση κ οχι τους υπολογισμους.

    --create numbers helper function, limited to smallint input
    CREATE FUNCTION dbo.Numbers_test(@n AS SMALLINT) 
    RETURNS TABLE
    AS
    RETURN
    (
    	WITH
    	  T0  AS (SELECT 1 AS c UNION ALL SELECT 1),
    	  T1  AS (SELECT 1 AS c FROM T0 AS A CROSS JOIN T0 AS B),
    	  T2  AS (SELECT 1 AS c FROM T1 AS A CROSS JOIN T1 AS B),
    	  T3  AS (SELECT 1 AS c FROM T2 AS A CROSS JOIN T2 AS B),
    	  T4  AS (SELECT 1 AS c FROM T3 AS A CROSS JOIN T3 AS B),
    	  Nums AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS n FROM T4)
    	SELECT TOP (CAST(@n AS BIGINT)) n 
    	FROM Nums 
    	ORDER BY n
    )
    
    GO
    
    --create customers table
    CREATE TABLE dbo.customers_test(CustID INT, CustName NVARCHAR(100), RoomID INT, CheckIn_Date DATETIME, CheckOut_Date DATETIME)
    GO
    --fill in some customers
    INSERT INTO dbo.customers_test(CustID, CustName, RoomID, CheckIn_Date, CheckOut_Date)
    VALUES(1, 'pelatis 1', 100, '20110201', '20110220'),
    	(2, 'pelatis 2', 200, '20110301', '20110315'),
    	(3, 'pelatis 3', 300, '20110401', '20110410'),
    	(4, 'pelatis 4', 400, '20110101', '20110107'),
    	(5, 'pelatis 5', 100, '20110110', '20110107'), --invalid reservation (checkout < checkin)
    	(6, 'pelatis 6', 100, '20110115', '20110115') --invalid reservation (checkout < checkin)
    GO
    	
    --create room prices table
    CREATE TABLE dbo.RoomPrices_test(RoomID INT, SeasonStart DATETIME, SeasonEnd DATETIME, Price MONEY)
    GO
    --fill in some prices
    INSERT INTO dbo.RoomPrices_test(RoomID, SeasonStart, SeasonEnd, Price)
    VALUES (100, '20110101', '20110131', 50),	
    	(100, '20110201', '20110210', 60),
    	(100, '20110217', '20110228', 100), --there is no price period for room 100 between 20110211 and 20110216
    	(200, '20110301', '20110305', 200),
    	(200, '20110306', '20110311', 300),
    	(200, '20110312', '20110316', 50),
    	(300, '20110101', '20110531', 80)
    	--no room prices for roomid = 400
    
    GO
    
    
    select * from dbo.customers_test
    select * from dbo.RoomPrices_test
    GO
    --example of dates that will be charged
    DECLARE @checkin_date DATETIME, @checkout_date DATETIME
    
    SELECT @checkin_date = '20110101', @checkout_date = '20110120'
    
    SELECT 'charge dates for checkin:' + CONVERT(VARCHAR(8), @checkin_date, 112) + ' and checkout:' + CONVERT(VARCHAR(8), @checkout_date, 112)
    
    SELECT DATEADD(dd, n-1, DATEADD(dd, DATEDIFF(dd, '19000101', @checkin_date), '19000101')) AS chrg_date
    FROM dbo.Numbers_test(DATEDIFF(dd, @checkin_date, @checkout_date))
    
    GO
    
    
    --inline table valued function
    CREATE FUNCTION dbo.RoomPricing1(@RoomID INT, @CheckIn_Date DATETIME, @CheckOut_Date DATETIME)	
    RETURNS TABLE
    AS
    RETURN
    (
    	SELECT SUM(rp.Price) AS TotalPrice, MAX(CASE WHEN rp.RoomID IS NULL THEN CAST(1 AS TINYINT) ELSE CAST(0 AS TINYINT) END) AS missing_prices
    	FROM 
    		(	
    			SELECT DATEADD(dd, n-1, DATEADD(dd, DATEDIFF(dd, '19000101', @checkin_date), '19000101')) AS chrg_date
    			FROM dbo.Numbers_test(DATEDIFF(dd, @checkin_date, @checkout_date))
    			WHERE DATEDIFF(dd, @checkin_date, @checkout_date) > 0
    			UNION ALL
    			SELECT DATEADD(dd, DATEDIFF(dd, '19000101', @checkin_date), '19000101')
    			WHERE DATEDIFF(dd, @checkout_date, @checkin_date) = 0
    		) AS charge_dates
    		--pay attention: multiple price periods for one day are not handled
    		LEFT JOIN dbo.RoomPrices_test AS rp ON rp.RoomID = @RoomID AND charge_dates.chrg_date BETWEEN rp.SeasonStart AND rp.SeasonEnd
    )
    
    GO
    
    --scalar function
    CREATE FUNCTION dbo.RoomPricing2(@RoomID INT, @CheckIn_Date DATETIME, @CheckOut_Date DATETIME)	
    RETURNS VARCHAR(20)
    AS
    BEGIN
    	DECLARE @price VARCHAR(20), @missing_prices TINYINT
    	
    	SELECT @price = SUM(rp.Price), @missing_prices = MAX(CASE WHEN rp.RoomID IS NULL THEN CAST(1 AS TINYINT) ELSE CAST(0 AS TINYINT) END)
    	FROM 
    		(	
    			SELECT DATEADD(dd, n-1, DATEADD(dd, DATEDIFF(dd, '19000101', @checkin_date), '19000101')) AS chrg_date
    			FROM dbo.Numbers_test(DATEDIFF(dd, @checkin_date, @checkout_date))
    			WHERE DATEDIFF(dd, @checkin_date, @checkout_date) > 0
    			UNION ALL
    			SELECT DATEADD(dd, DATEDIFF(dd, '19000101', @checkin_date), '19000101')
    			WHERE DATEDIFF(dd, @checkout_date, @checkin_date) = 0
    		) AS charge_dates
    		--pay attention: multiple price periods for one day are not handled
    		LEFT JOIN dbo.RoomPrices_test AS rp ON rp.RoomID = @RoomID AND charge_dates.chrg_date BETWEEN rp.SeasonStart AND rp.SeasonEnd
    
    	SET @price = CASE @missing_prices WHEN 1 THEN '!!!!' ELSE '' END + ISNULL(@price, 'no price')
    	RETURN(@price)
    END
    
    GO
    
    
    --use inline table valued udf
    SELECT c.*, rp.*
    FROM dbo.customers_test AS c
    	CROSS APPLY dbo.RoomPricing1(c.RoomID, c.CheckIn_Date, c.CheckOut_Date) AS rp --cross apply as dbo.RoomPricing1 returns always οne row (aggregates are used)
    
    
    --use scalar udf
    SELECT c.*, dbo.RoomPricing2(c.RoomID, c.CheckIn_Date, c.CheckOut_Date) AS price
    FROM dbo.customers_test AS c
    
    
    --cleanup
    DROP FUNCTION dbo.RoomPricing1
    DROP FUNCTION dbo.RoomPricing2
    DROP FUNCTION dbo.Numbers_test
    DROP TABLE dbo.customers_test
    DROP TABLE dbo.roomprices_test

     

    --ΗΤΗ--

  •  29-01-2011, 18:27 62775 σε απάντηση της 62771

    Απ: μπωρω να εκτελέσω μια 2η stored procedure μεσα απο μια αλλαη και να επιστρεψει τιμη σε πεδιο της πρωτης?

    εξερετικο παραδειγμα - λυση αν και δεν χρειαζοταν να κανεις και τους πινακες αφου υπαρχουν οι πινακες με τις τιμες, ουτε πολυ σκεψη για την χρεωση ανα ωρα διοτι θα εφαρμωστει και σε ενοικιασει αυτοκινητων αυτο!
    οποτε οσες μερες λεει ο πελατης τοσες θα χρεωθεί!



    σε ευχαριστω παρα πολυ,Yes
     και αυτο που διαπιστώνω ειναι οτι για καποιον που δεν εχει ξαναγραψει Stored Procedure (παρα μονο 2 select few years back) σιγουρα το να κανει αυτο δεν ειναι υποθεση λιγων ωρων!!!! 

    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems