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

 

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

SQL Error message details

Îåêßíçóå áðü ôï ìÝëïò serakar. Τελευταία δημοσίευση από το μέλος serakar στις 21-10-2012, 10:58. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  17-10-2012, 09:43 71424

    SQL Error message details

    Καλημέρα

    Έχω μία stored procedure που επιλέγει κάποια data από διάφορους πίνακες και τα εισάγει σε κάποιον άλλο.  Έχει δηλαδή μια εντολή δηλαδή του τύπου (απλοποιημένη):

    INSERT INTO table_b SELECT a, b, c, d, e, f, g, h FROM table_a

    Αυτό λοιπόν κάποιες φορές, επειδή τα πεδία των δύο πινάκων δεν είναι ακριβώς ίδια, επιστρέφει error.  Πχ. "Arithmetic overflow error converting numeric to data type numeric." χωρίς καμία παραπάνω πληροφορία.  Αυτό που θέλω είναι περισσότερες λεπτομέρειες για το τι ακριβώς δημιουργεί το πρόβλημα, δηλαδή ποιο record και ποιο πεδίο.  Υπάρχει κάποιος τρόπος να πάρω αυτή την πληροφορία?  Ο server είναι 2008 και χρησιμοποιώ το Management studio.

    Ευχαριστώ

  •  17-10-2012, 11:19 71425 σε απάντηση της 71424

    Απ: SQL Error message details

    Δώσε λίγο περισσότερα στοιχεία για το λάθος. Απ' ό,τι βλέπω, το Arithmetic overflow μπορεί να το το πάρεις για για conversion από numeric σε varchar. Επίσης, υπάρχει ένα command line utility που μπορείς να χρησιμοποιήσεις για να βρεις τις διαφορές μεταξύ δύο πινάκων (tablediff). Κάποιο καλό παιδί μας λυπήθηκε κι έφτιαξε gui γι' αυτό. Δεν το έχω χρησιμοποιήσει, αλλά νομίζω ότι γνωρίζοντας που διαφέρουν οι δύο πίνακες θα είναι πιο εύκολο να αναγνωρίσεις το πεδίο στο οποίο εμφανίζεται το σφάλμα. Αν δεν το βρεις στο directory "C:\Program Files\Microsoft SQL Server\90\COM\TableDiff.exe", κοίταξε και στο Program Files (86x).

    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  17-10-2012, 12:04 71426 σε απάντηση της 71425

    Απ: SQL Error message details


    Ευχαριστώ για την απάντηση, αλλά νομίζω ότι χρειάζομαι κάτι διαφορετικό, γιατί εγώ δεν έχω data στο table_b, προσπαθώ να εισάγω και χτυπάει ο λάθος, και φυσικά δεν κάνει την εισαγωγή.

    Το πρόβλημα το έχω ήδη βρει, αλλά με πολύ ψάξιμο οπτικά στα data του table_a.  Ο λόγος που παρουσιάστηκε ήταν ότι στο table_a το πεδίο x ήταν decimal(7,2), στο table_b ήταν decimal(5,2) και σε ένα από τα 20000 records το πεδίο στο table_a είχε τιμή που δεν χώραγε στο πεδίο του table_b.  Το πρόβλημα είναι ότι τέτοιες 'ασυμβατότητες' μεταξύ πεδίων υπάρχουν πολλές και οι πίνακες δεν μπορούν να αλλάξουν γραμμογράφηση ούτε από την μία πλευρά ούτε από την άλλη.  Οπότε αναγκαστικά όποτε παρουσιάζεται πρόβλημα (είμαστε ακόμα σε test) πρέπει να διερευνηθεί και να αποφασιστεί πως θα αντιμετωπιστεί (συνήθως μέσω της εφαρμογής που γεμίζει το table_a).

    Αυτό που θέλω εγώ είναι να μπορώ 'εύκολα' να βρω σε ποιο από τα 20000 records υπάρχει πρόβλημα και σε ποιο από τα 5-10 πεδία του αρχείου με την παραπάνω 'ασυμβατότητα'.  Να μου πει π.χ. ότι το πεδίο Χ στο record 14567 δεν μπορεί να εισαχθεί, να μου δώσει την αξία που δεν μπορεί να εισαχθεί, κάτι τέλος πάντων για να μην χρειάζεται να ψάχνω όλα τα data να δω τι χτυπάει.

    Ευχαριστώ και πάλι.
  •  17-10-2012, 13:05 71427 σε απάντηση της 71426

    Απ: SQL Error message details

    Καλησπέρα,
    ίσως για διαγνωστικούς λόγους να πάιξεις με την FLOOR() και την LEN() ώστε να δεις ποιά records έχουν πάνω από το επιθυμητό ακέραιο μέρος.
    πχ.

        SELECT * FROM table_a WHERE LEN(FLOOR(col_a)) > 3

    θα πρέπει να σου επιστρέψει όλες τις εγγραφές που έχουν μεγαλύτερο ακέραιο μέρος από 3 ψηφία.
    VI
  •  17-10-2012, 13:33 71428 σε απάντηση της 71427

    Απ: SQL Error message details

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

    Η μία λύση προφανώς είναι αυτό που προτείνει ο Βασίλης, να ελέγξεις την τιμή όλων των εγγραφών πριν ξεκινήσεις (όχι απαραίτητα με αυτό το statement). 

    Υποψιάζομαι όμως ότι χρησιμοποιείς λάθος εργαλείο. Αν θέλεις να μεταφέρεις τακτικά δεδομένα μεταξύ πινάκων που διαφέρουν καλύτερα είναι να χρησιμοποιήσεις ένα SSIS transformation το οποίο θα μεταφέρει τα δεδομένα από τον ένα πίνακα στον άλλο και θα στέλνει τα προβληματικά δεδομένα μέσω του error output σε κάποιο τρίτο πίνακα ή log αρχείο. 

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  17-10-2012, 14:22 71429 σε απάντηση της 71428

    Απ: SQL Error message details

    Ευχαριστώ και τους δύο.

    Παναγιώτη δεν κατάλαβα τι εννοείς για την γραμμογράφηση, εγώ πάντως όταν λέω γραμμογράφηση εννοώ τους τύπους και τα μήκη των πεδίων, δεν ξέρω αν είναι άλλη η κατάλληλη λέξη, ούτε βέβαια είπα ότι τα δεδομένα είναι προβληματικά.

    Καλοί οι εναλλακτικοί τρόποι που προτείνετε και μάλλον εκεί θα καταλήξω, απλά να σιγουρέψω πρώτα ότι δεν υπάρχει τρόπος να πάρεις παραπάνω πληροφορίες για το error του τρόπου που ήδη χρησιμοποιώ, μια και αυτό θα ήταν το καλύτερο για την περίπτωσή μου.


  •  17-10-2012, 15:31 71431 σε απάντηση της 71429

    Απ: SQL Error message details

    Δεν υπάρχει πιο λεπτομερές μήνυμα. Αν το σκεφτείς από τη μεριά της βάσης μάλιστα δεν έχει και νόημα, καθώς τα δεδομένα που θα εισαχθούν είναι αποτέλεσμα ενός query και έτσι δεν υπάρχει πλέον η έννοια της "γραμμής". Μπορεί να είναι αποτέλεσμα join, αριθμητικών πράξεων, aggregations. 

    Θα μπορούσε ίσως η βάση να σου επιστρέφει τη γραμμή που δεν μπόρεσε να εισάγει αλλά αυτό θα κόστιζε πάρα πολύ. Ο λόγος είναι ότι από τη στιγμή που υπάρχει σφάλμα το INSERT πρέπει να αποτύχει. Το execution plan ενός query μπορεί να είναι αρκετά περίπλοκο και το σημείο στο οποίο γίνεται η μετατροπή από το ένα precision στο άλλο σχεδόν σίγουρα είναι πολύ πριν το βήμα της εγγραφής των δεδομένων. Αντί να υπολογίζει δεδομένα τα οποία έτσι κι αλλιώς θα πετάξει, η βάση απλά διακόπτει το execution χωρίς να προσπαθήσει να δημιουργήσει τις τελικές γραμμές.

    Πρώτα πρέπει να καταλήξεις στο τί θα κάνεις με τα δεδομένα που δεν μπορούν να μεταφερθούν και μετά θα βρεις άκρη, καθώς αυτό το stored procedure θα πρέπει να τρέχει συνέχεια και ίσως να χειρίζεται τέτοιες περιπτώσεις κάθε φορά. Αν θεωρείς ότι οι αρχικές εγγραφές είναι "λάθος" θα πρέπει να διορθώσεις τα δεδομένα.  Αν οι εγγραφές πρέπει να αποκλειστούν, θα πρέπει να φτιάξεις ένα query που θα κόβει τις εγγραφές με τιμή μεγαλύτερη από την επιτρεπόμενη. 

    Αν θέλεις να ψάξεις ποιές είναι οι προβληματικές εγγραφές θα πρέπει να χρησιμοποιήσεις queries σαν αυτό που πρότεινε ο Βασίλης. Εγώ βέβαια θα πρότεινα κάτι σαν το 
    select * from table_a
    where log10(column_a)>3
    γιατί η LEN επιστρέφει το μήκος του string, αλλά για τη βάση δεν έχει ουσιαστική διαφορά.

    Μπορείς επιπλέον να χρησιμοποιήσεις τις πληροφορίες που υπάρχουν για τις στήλες στο INFORMATION_SCHEMA.COLUMNS view για να δεις ποιές εγγραφές δεν μπορούν να μερθούν από μία στήλη σε μία άλλη:

    select * from table_a
    where log10(column_a)>
    	(select NUMERIC_PRECISION - NUMERIC_SCALE 
    		from INFORMATION_SCHEMA.COLUMNS
    		where TABLE_NAME='table_b' 
    			and DATA_TYPE='numeric'
    			and COLUMN_NAME='column_b')


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  21-10-2012, 10:58 71445 σε απάντηση της 71431

    Απ: SQL Error message details

    Ευχαριστώ και πάλι, θα χρησιμοποιήσω κάτι από τα παραπάνω.
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems