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

 

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

Πρόσθεση με TSQL

Îåêßíçóå áðü ôï ìÝëïò Παπαδημητρίου Γεώργιος. Τελευταία δημοσίευση από το μέλος nikolaosk στις 19-01-2009, 12:42. Υπάρχουν 10 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  17-01-2009, 16:07 47705

    Πρόσθεση με TSQL

    Hello!

    'Εχω δημιουργήσει μια Select η οποία επιστρέφει τα παρακάτω string

    1-1
    0-2
    1-2
    πως μπορώ να προσθέσω με χρήση TSQL τους αριθμούς?
    Το αποτέλεσμα πχ για το παραπάνω παράδειγμα θα πρέπει να είναι ίσο με 7

    (1+1) + (0+2) + (1+2) = 7

    Ευχαριστώ εκ των προτέρων
  •  17-01-2009, 16:37 47708 σε απάντηση της 47705

    Απ: Πρόσθεση με TSQL

    Ένας τρόπος είναι να το κάνεις cast σε decimal/integer και να κάνεις την πράξη κανονικά. Ρίξε μια ματιά εδώ http://msdn.microsoft.com/en-us/library/ms187928.aspx

    Να ξέρεις πάντως ότι αυτά (casting, convert κλπ) "κοστίζουν" σε CPU cycles κι όχι μόνο. Εγώ θα πρότεινα είτε κάνεις τους υπολογισμούς στον client, είτε να φτιάξεις κάποιο assembly (για 2005 και μετά) το οποίο κάνει τους υπολογισμούς και επιστρέφει το αποτέλεσμα, είτε να αλλάξεις το schema της βάσης σου ώστε αυτά τα πεδία να είναι decimal/integer/whatever ώστε να γίνεται ο υπολογισμός χωρίς casting. Σπάνια αποτελεί καλή λύση να κάνεις τόσα πολλά cast/convert.


    Παναγιώτης Κεφαλίδης

    "Για να επιτύχεις, θα πρέπει το πάθος σου για την επιτυχία να είναι μεγαλύτερο απο τον φόβο σου για την αποτυχία"

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Παρακαλώ διαβάστε τους όρους χρήσης.
  •  17-01-2009, 17:49 47711 σε απάντηση της 47705

    Απ: Πρόσθεση με TSQL

    έχει δίκιο ο παναγιώτης. το casting σκοτώνει το performance. ειδικά σε πολλά δεδομένα και όταν κάνεις multiple castings

    αν θες να δεις πως είναι περίπου αυτό που ζητάς.άνοιξε το SSMS, connect to sql server, και σε ένα query window type

    declare @str1 varchar (10)

    declare @str2 varchar(10)

    declare @num int

    set @str1=2

    set @str2=1

    set @num=cast(@str1 as int) + CAST(@str2 as int)

    select @num

     

    το τρέχεις όλο μαζί αυτό σαν batch. Μην τρέξεις κάθε γραμμή ξεχωριστά


    Νικόλαος Καντζέλης
    BSc, MSc, MCAS, MCPD, MCITP, MCTS,MCP, MCT
    http://www.nksolutions.gr
    http://dotnetstories.wordpress.com
    http://weblogs.asp.net/dotnetstories
    http://forum.dotnetnuke.gr
  •  17-01-2009, 19:25 47713 σε απάντηση της 47711

    Απ: Πρόσθεση με TSQL

    Νομίζω πως και η παύλα δεν θα είναι και μία ακόμη εργασία που πρέπει να κάνει για να διαλέξει
    από το string τους αριθμούς μόνο? δηλαδή αν το string είναι "1-1" πρέπει να πάρει τον πρώτο
    και τον τελευταίο χαρακτήρα και να τους κάνει μετά casting και convert και μετά το operation που θέλει.
    Πολύ δουλειά. Καλύτερα αν μπορείς να αλλάξεις το datatype για να γυρνάει αριθμήτικό τύπο.

    Εκτός αν κατάλαβα λάθος και η παύλα δεν λέει τίποτα!

    ??

  •  17-01-2009, 20:54 47715 σε απάντηση της 47713

    Απ: Πρόσθεση με TSQL

    ναι μάλλον το ήθελε αι αυτό, ο φίλος.θα πρέπει να χρησιμοποιήσει τις built in string functios του SQL Server,όπως η Substring και η charindex.

     

    ρίξε μια ματιά εδώ. αν το τρέξεις αυτό θα σου δώσει 5. πάει και βρίσκει την θέση του "-" χαρακτήρα και μετά προσθέτει τις τιμές αριστερά και δεξιά του "-"

     

    declare @str1 varchar (10)

    declare @num int

    set @str1='3-2'

    set @num=cast((SELECT SUBSTRING(@str1,CHARINDEX('-',@str1)+1, 1)) as int) + CAST((SELECT SUBSTRING(@str1,CHARINDEX('-',@str1)-1, 1) ) as int)

    select @num

    --print @num


    Νικόλαος Καντζέλης
    BSc, MSc, MCAS, MCPD, MCITP, MCTS,MCP, MCT
    http://www.nksolutions.gr
    http://dotnetstories.wordpress.com
    http://weblogs.asp.net/dotnetstories
    http://forum.dotnetnuke.gr
  •  17-01-2009, 22:39 47716 σε απάντηση της 47715

    Απ: Πρόσθεση με TSQL

    Νομίζω ότι πρώτα θα πρέπει ο gipap να εξηγήσει τί θέλει να κάνει, και εφόσον πρόκειται για άσκηση να δώσει την ίδια την εκφώνηση. Αυτό που ζητάει είναι περίεργο και κάτι μου λέει ότι αυτό που πραγματικά ζητάει η άσκηση (αν πρόκειται για άσκηση) είναι διαφορετικό. Γιατί το select επιστρέφει αυτά τα strings και όχι τους αριθμούς ξεχωριστά? Αν επέστρεφε τους αριθμούς αντί για string θα αρκούσε ένα απλό sum για να τελειώσει κανείς.
    Ας μην ξεχνάμε επίσης ότι η SQL δουλεύει με set. Η λύση του Νίκου προϋποθέτει την ύπαρξη cursor ο οποίος θα εκτελέσει τον κώδικα του μία φορά για κάθε εγγραφή που επιστρέφει η select. Αν όμως πρόκειται για άσκηση, ο καθηγητής δεν θα χαρεί καθόλου με μία procedural απάντηση. Μπορεί να δουλεύει αλλά δεν είναι αυτό που ζήτησε.

    Αν το Select αλλάξει έτσι ώστε να επιστρέφει ξεχωριστά τους αριθμούς, π.χ. Num1 και Num2, μπορεί κανείς να πάρει το επιθυμητό αποτέλεσμα με ένα απλό sum:

    select sum(num1 + num2)
    from (select .......... )

    Αν υπάρχει σοβαρός λόγος να επιστρέφεται αυτό το string (κάτι πολύ απίθανο) μπορεί κανείς να πάρει πάλι το ίδιο αποτέλεσμα ως:

    select
    sum(
    cast(SUBSTRING(Nums,0,SeparatorIndex) as int)+
    cast(SUBSTRING(Nums,SeparatorIndex+1,100) as int)
    )
    from
    (select Nums, CHARINDEX('-',Nums,0) as SeparatorIndex
    from (SELECT ...)
    ) As Numbers

    Πρώτα βρίσκω τη θέση του separator και μετά σπάω το string, μετατρέπω σε αριθμό και κάνω sum.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  19-01-2009, 10:50 47739 σε απάντηση της 47716

    Απ: Πρόσθεση με TSQL

    Παναγιώτης Καναβός:

    Νομίζω ότι πρώτα θα πρέπει ο gipap να εξηγήσει τί θέλει να κάνει, και εφόσον πρόκειται για άσκηση να δώσει την ίδια την εκφώνηση. Αυτό που ζητάει είναι περίεργο και κάτι μου λέει ότι αυτό που πραγματικά ζητάει η άσκηση (αν πρόκειται για άσκηση) είναι διαφορετικό.

    Οχι Παναγιώτη δεν πρόκειται για άσκηση. Πρόκειται για την προσωπική μου ιστοσελίδα.

    Παναγιώτης Καναβός:

    Γιατί το select επιστρέφει αυτά τα strings και όχι τους αριθμούς ξεχωριστά?


    Γιατί τα αποτελέσματα της Select είναι αποτελέσματα αγώνων ποδοσφαίρου.
    0-1
    4-3

    Παναγιώτης Καναβός:

    Ας μην ξεχνάμε επίσης ότι η SQL δουλεύει με set. Η λύση του Νίκου προϋποθέτει την ύπαρξη cursor ο οποίος θα εκτελέσει τον κώδικα του μία φορά για κάθε εγγραφή που επιστρέφει η select. Αν όμως πρόκειται για άσκηση, ο καθηγητής δεν θα χαρεί καθόλου με μία procedural απάντηση. Μπορεί να δουλεύει αλλά δεν είναι αυτό που ζήτησε.


    Οσο για τον κύριο καθηγητή μάλλον θα χαρεί μαζί με εμένα για 2 λόγους!
    1) Θα του δώσω στάνταρ για το στοίχημα!
    2) Έχω χρησιμοποιήσει cursor για το for loop (Όχι ότι καλύτερο βέβαια σε σχέση με αυτό που πρότεινες)

    DECLARE
    MyCursor CURSOR FOR

    'ΕΔΩ ΕΙΝΑΙ Η SELECT ΜΟΥ'

    OPEN MyCursor

    FETCH MyCursor INTO @AkrivesSkor

    SET @Sum =0

    SET @i = 0

    WHILE @@Fetch_Status = 0

    BEGIN

    SET @str1 = @AkrivesSkor

    SET @num=cast((SELECT SUBSTRING(@str1,CHARINDEX('-',@str1)+1, 1)) as int) + CAST((SELECT SUBSTRING(@str1,CHARINDEX('-',@str1)-1, 1) ) as int)

    SET @Sum = @Sum + @num

    SET @i = @i+1

    FETCH MyCursor INTO @AkrivesSkor

    END

    if @i = 6

    BEGIN

    SET @MesosEktos = @Sum / 6.00

    SELECT @MesosEktos

    END

    ELSE

    SET @MesosEktos = 0

    SELECT @MesosEktos

    CLOSE MyCursor

    DEALLOCATE MyCursor

    Για δυνατούς λύτες φαντάζομαι είναι η χρήση LOOP χωρίς cursor.
    Κάτι που δεν κατέχω ακόμα τουλάχιστον.

    Ο εχθρός του καλού είναι πάντα το καλύτερο.
    Σε ευχαριστώ Παναγιώτη.

  •  19-01-2009, 11:01 47740 σε απάντηση της 47739

    Απ: Πρόσθεση με TSQL

    Θα σου πρότεινα να ΜΗΝ χρησιμοποιήσεις cursors. Ήδη σου έδωσα μία λύση γρηγορότερη η οποία δεν απαιτεί cursors. Οι cursors είναι η πιο αργή λύση που μπορείς να χρησιμοποιήσεις σχεδόν σε κάθε περίπτωση.  Ο λόγος είναι ότι αντί να αφήνεις τη βάση να χειριστεί όλα τα δεδομένα μαζί, την αναγκάζεις να τα επεξεργαστεί ένα-ένα παρακάμπτωντας οποιοδήποτε optimization θα μπορούσε να χρησιμοποιηθεί.  Η χρήση cursors είναι μία από τις μεγαλύτερες πηγές καθυστέρησεις και προβλημάτων concurrency (βλέπε blocking, deadlocks) γιατί κρατάει ανοικτά locks για όλη τη (μακρά) διάρκεια του cursor.

    Τα αποτελέσματα τα παίρνεις από άλλη βάση ή από τη δική σου? Γιατί αν πρόκειται για τη δική σου μπορείς άνετα να τα σπάσεις σε ξεχωριστά πεδία κατά την αποθήκευση.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  19-01-2009, 11:18 47741 σε απάντηση της 47740

    Απ: Πρόσθεση με TSQL

    Όντως για τους cursors δεν έχω διαβάσει τα καλύτερα... αλλά μάλλον θα πρέπει να ανοίξω διαφορετικό thread γι' αυτό

    Γενικά όμως υπάρχει κάποιος ''μπούσουλας'' για χρήση for loop χωρίς cursor?
    Γιατί δεν βλέπω κάτι άλλο εκτός από nested Select στη λύση που πρότεινες.
    Μήπως τελικά αυτός είναι ο ''μπούσουλας''?

    Τα αποτελέσματα είναι από δική μου βάση.
    Απλά όταν ξεκίνησε η ιδέα, ως "βάση" χρησιμοποιούσα το excel.

    Μέχρι και σήμερα όμως τα αποτελέσματα είναι ως string στον SQL server λόγω θέσπισης προτεραιοτήτων...

  •  19-01-2009, 12:05 47744 σε απάντηση της 47741

    Απ: Πρόσθεση με TSQL

    Γιατί επιμένεις να κάνεις loop? Εξάλλου ένας cursor είναι ουσιαστικά loop επάνω σε data και το αντίστροφο. Τον κώδικα τον έχεις ήδη γράψει. Είτε συγκρίνεις το @@FETCH_Status είτε το αποτέλεσμα κάποιου άλλου query, το loop είναι πάντα ένα WHILE BEGIN ... END.

    Μπορείς άνετα να φτιάξεις ένα query το οποίο θα επιστρέφει τον αριθμό των εγγραφών που ικανοποιούν μία συνθήκη  (π.χ. Status=1) και μετά μέσα στο BEGIN ... END να τροποποιείς το Status . Πριν το END ξανατρέχεις το query που ελέγχει τη συνθήκη. Αυτό όμως δεν διαφέρει από ένα cursor. Πάλι θα έχεις αργή εκτέλεση, πάλι θα έχεις locks μεγάλης διαρκείας.

    Πολύ σπάνια χρειάζεσαι loops ή cursors και σχεδόν ποτέ για απλές περιπτώσεις όπως ένα web application. Θα τους χρειαστείς αν πρέπει να τροποποιήσεις με τη μία πολλές δεκάδες χιλιάδες εγγραφές σε batches, ή αν θέλεις να υπολογίσεις running totals σε εκατοντάδες εγγραφές. Σε κάθε άλλη περίπτωση όμως μπορείς να γράψεις ένα SELECT ή UPDATE που να σου κάνει τη δουλειά.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  19-01-2009, 12:42 47746 σε απάντηση της 47705

    Απ: Πρόσθεση με TSQL

    μην χρησιμοποιείς cursor. ήδη έχεις ενναλακτική λύση.

     

    δες λίγο εδώ

     

    http://www.sql-server-performance.com/tips/cursors_p1.aspx

    http://www.sqlteam.com/article/cursors-an-overview

     


    Νικόλαος Καντζέλης
    BSc, MSc, MCAS, MCPD, MCITP, MCTS,MCP, MCT
    http://www.nksolutions.gr
    http://dotnetstories.wordpress.com
    http://weblogs.asp.net/dotnetstories
    http://forum.dotnetnuke.gr
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems