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

 

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

Βοήθεια Σχετικά με Procedure

Îåêßíçóå áðü ôï ìÝëïò Αλέξανδρος Δημητρίου. Τελευταία δημοσίευση από το μέλος Αλέξανδρος Δημητρίου στις 16-11-2007, 19:38. Υπάρχουν 12 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  13-10-2007, 14:58 36225

    Βοήθεια Σχετικά με Procedure

    Γεια σας Παιδιά!Πάλι η βοηθειά σας μου είναι σημαντική!

    Δεδομένα:

    Έχω ένα πίνακα χρηστών με διάφορα πεδία!

    Αίτημα:

    Θέλω να φτιάξω μια procedure η οποία θα παίρνει ώς τιμές ονόματα χρηστών αλλά κάθε φορά θα αλλάζει ο αριθμός των παραμέτρων αυτών.δλδ: Μπορει μια φορά να θέλω να κάνω update σε δύο χρήστες ή άλλη περιπτωση σε 3 , 4 ή 5

    πχ: exec usp_usersUpd 'sa' , 'nikos' , 'giannis'     ή  exec usp_usersUpd  'nikos'

    Μπορεί να γίνει κάτι τέτοιο? 


    Αυτοί που ζουν γενναίοι είναι ενάρετοι,κάνουν ένδοξες πράξεις και πέθαινουν αιώνια ξακουστοί....
    Μ.Αλέξανδρος...IV Crusade...
  •  13-10-2007, 16:23 36227 σε απάντηση της 36225

    Απ: Βοήθεια Σχετικά με Procedure

    Ετσι όπως το περιγράφεις δεν είναι πολύ σαφές το πώς θέλεις να γίνεται το μαζικό update. Κατ'αρχήν, πού θα ξέρει η sp ποιά records θα κάνει update;  Υποθέτω οτι θα το ξέρει από τα ονόματα των χρηστών, αλλά αν αυτά δεν είναι μοναδικά;

    Οχι οτι αυτό έχει να κάνει με το πώς θα επιτύχεις αυτό που ζητάς, αλλά θα μας βοηθούσε να σου δώσουμε τη σωστότερη λύση.


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

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  13-10-2007, 17:46 36230 σε απάντηση της 36227

    Απ: Βοήθεια Σχετικά με Procedure

    Μα αυτό ειναι και η ερωτησή μου.Δεν θέλω λύση στο συγκεκριμένο πρόβλημα.Θέλω το τρόπο που θα φτιάξω μια procedure η οποία δε θα ζητά συγκεκριμένο πλήθος παραμέτρων.Το παράδειγμα  που έδωσα στην αρχή είναι τυπικό.Μη το λαμβάνετε υπ'οψιν.

    Σκεφτειτε αυτο : (Υποθέτουμε οτι το userid είναι μοναδικό)

    Create Prosedure Usp_Upd_Users (@userid nvarchsr (20) X n )

    As begin

    Update Users set ..... = ...... Where userid in (παράμετρο)

    End

    Γίνεται να δημιουργηθεί τέτοια procedure  ή έχω πολύ φαντασία?.........Ευχαριστώ για το χρόνο σας!

     

     

     


    Αυτοί που ζουν γενναίοι είναι ενάρετοι,κάνουν ένδοξες πράξεις και πέθαινουν αιώνια ξακουστοί....
    Μ.Αλέξανδρος...IV Crusade...
  •  13-10-2007, 23:56 36239 σε απάντηση της 36230

    Απ: Βοήθεια Σχετικά με Procedure

    Τώρα το κατάλαβα καλυτερα. Αρχικά νόμισα οτι είχε άμεση σύνδεση με το παράδειγμα που είχες δώσει.

    Ενας απλός τρόπος για να δημιουργήσεις μια stored procedure με μεταβλητό αριθμο παραμέτρων είναι ουσιαστικά να δημιουργήσεις μια stored procedure που να δέχεται ΜΙΑ παράμετρο η οποία θα ειναι τύπου varchar (με μεγάλο μήκος, π.χ. varchar(8000)) και η οποία θα περιέχει ένα delimited list (comma-delimited ή με άλλο delimeter)

    Στη συνέχεια, μπορείς με διάφορους τρόπους (θα ψάξω να σου βρω έναν από αυτούς) να "σπάσεις" το list αυτό στα συστατικά του στοιχεία και, αν χρειάζεται, να κάνεις convert τα στοιχεία αυτά στο σωστό data type. Μπορείς στη συνέχεια τα στοιχεία αυτά να τα "περάσεις" σε ένα table variable (in-memory table) ή ακόμα και σε ένα temporary table και στη συνέχεια να τα χρησιμοποιήσεις μέσα στην stored procedure σου όπως εσύ κρίνεις καλύτερα.

    Γνωστοί περιορισμοί σε αυτή την προσέγγιση:

    - Δεν έχεις καλό parameter checking. Αν η stored procedure σου περιμένει αριθμούς σαν ορίσματα και εσύ δώσεις σε ένα στοιχείο της λίστας χαρακτήρες, θα "χτυπήσει" κατά την εκτέλεση και όχι κατά την κλήση.
    - Το μήκος των 8000 χαρακτήρων (max μήκος μεταβλητών varchar) αποτελεί από μόνο του ένα περιορισμό αν θέλεις να περάσεις εξαιρετικα μεγάλο αριθμό παραμέτρων.
    - Θέλει λίγο περισσότερο κώδικα εσωτερικά στην stored procedure για να "διαχωρίσεις" τα στοιχεία, ή εναλλακτικά απαιτεί τη δημιουργία κάποιας user defined function / δευτερεύουσας stored procedure που θα κάνει αυτή τη δουλειά.


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

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  14-10-2007, 12:02 36245 σε απάντηση της 36239

    Απ: Βοήθεια Σχετικά με Procedure

    Σε ευχαριστώ για το χρόνο σου , αναμένω απαντήσεις......


    Αυτοί που ζουν γενναίοι είναι ενάρετοι,κάνουν ένδοξες πράξεις και πέθαινουν αιώνια ξακουστοί....
    Μ.Αλέξανδρος...IV Crusade...
  •  14-10-2007, 12:08 36246 σε απάντηση της 36245

    Απ: Βοήθεια Σχετικά με Procedure

    Ενα παράδειγμα splitting δίνει αυτό εδώ το άρθρο: http://weblogs.sqlteam.com/dinakar/archive/2007/03/28/60150.aspx

    Επίσης μπορείς να κοιτάξεις και εδώ: http://www.4guysfromrolla.com/webtech/031004-1.shtml


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

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  14-10-2007, 19:13 36253 σε απάντηση της 36246

    Απ: Βοήθεια Σχετικά με Procedure

    Τι SQL Server χρησιμοποιείς ?
    Σε SQL 2005 μπορείς να το κάνεις με Hosted CLR procedures -  Περνάς παραμέτρους με XML όπου - φαντάζομαι -  μπορείς να κάνεις και type checking.

    Harry Tsavdaris
  •  14-10-2007, 20:57 36257 σε απάντηση της 36253

    Απ: Βοήθεια Σχετικά με Procedure

    Δεν χρειάζεται να χρησιμοποιήσει κανείς CLR stored procedures, μπορεί να περάσει τα δεδομένα ως XML απευθείας σε ένα T-SQL stored procedure. Το πρόβλημα του strong typing όμως παραμένει. Δεν υπάρχει κάτι που να εμποδίζει τη χρήση ενός λανθασμένου XML. Το ίδιο συμβαίνει και με το CLR stored procedure. Θα πρέπει κανείς να ελέγξει με κώδικα ότι το XML έχει τα σωστά περιεχόμενα. Επιπλέον, ένα CLR Stored Procedure χρειάζεται περισσότερο κώδικα για να εκτελέσει εντολές select, update, insert.

    Αντί γι αυτό όμως μπορείς να φτιάξεις και να χρησιμοποιήσεις ένα CLR function το οποίο θα παίρνει ένα string από τιμές και θα επιστρέφει πίνακα. Αυτό το function θα μπορείς μετά να το χρησιμοποιήσεις σε οποιοδήποτε stored procedure θέλεις.

    Δες το Arrays and Lists in Sql Server 2005 του Erland Sommarskog, το οποίο περιγράφει σχεδόν όλες τις γνωστές μεθόδους για να περάσεις πολλαπλές τιμές σε ένα stored procedure. Υπάρχει και ένα παλαιότερο άρθρο για SQL Server 2000.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  14-10-2007, 21:29 36258 σε απάντηση της 36257

    Απ: Βοήθεια Σχετικά με Procedure

    Συμφωνώ. Τo XML δε λύνει τον έλεγχο τύπου αυτόματα. Αν όμως αν περνάς στο XML την τιμή και τον τύπο της, μπορείς να κάνεις ελέγχους για τον τύπο.
    Έτσι τo CLR function που προτείνεις θα το υλοποιούσα ώστε να παίρνει string από τιμές και τύπους.
    Βέβαια όλο αυτό είναι πιο περίπλοκο στον κώδικα αλλά εξαρτάται από τις ανάγκες που υπάρχουν.

    Harry Tsavdaris
  •  18-10-2007, 09:12 36355 σε απάντηση της 36258

    Απ: Βοήθεια Σχετικά με Procedure

    ευχαριστώ πολύ παιδιά!

    Είστε άψογοι.


    Αυτοί που ζουν γενναίοι είναι ενάρετοι,κάνουν ένδοξες πράξεις και πέθαινουν αιώνια ξακουστοί....
    Μ.Αλέξανδρος...IV Crusade...
  •  18-10-2007, 17:20 36367 σε απάντηση της 36355

    Απ: Βοήθεια Σχετικά με Procedure

    Θα μπορούσες πολύ απλά να είχες ένα πίνακα μέ την εξής μορφή

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Create table tblUpdUsers
    (
    SPIDID int,
    usrName varchar(255)
    )

    ---- Το πεδίο SPIDID είναι @@SPID δήλαδή το connection σου το παίρνεις εκτελώντας το select @@SPID
    ----Κατόπιν μέσα από την εφαρμογή σου εισάγεις στον πίνακα τά ονόματα τών χρηστών που θέλεις.
    insert into tblUpdUsers values (53,'sa') ---όπου 53 είναι η τιμή που σου έχει γυρίσει από τό @@SPID
    insert into tblUpdUsers values (53,'petros')
    insert into tblUpdUsers values (53,'anna')
    ----αυτό το κάνεις βέναια μέσα από ένα loop στην εφαρμογή.
    ----Κατόπιν στην Stored Procedure προσθέτεις μία παράμετρο που παίρνει την τιμή του @@SPID δηλαδή τό 53 στό συγκεκριμμένο παράδειγμα.
    -------π.χ. χουμε την
    procedure updApplicationUsers 
    (
    @spidid int
    )
    as

    update tblUsers set status=-1 where usrName in (select usrName from tblUpdUsers where SPIDID=@spidid )

     

     


    Ιωάννης Μανουσάκης
  •  16-11-2007, 19:27 37389 σε απάντηση της 36367

    Απ: Βοήθεια Σχετικά με Procedure

    Φίλε imano η ιδέα σου είναι αρκετα καλή αν και όπως προανέφερα το παράδειγμα είναι τυπικό.Εγώ αυτο που 'ήθελα ήταν μια procedure με τη δυνατότητα αγώστων αριθμών παραμέτρων ίδιου τύπου.

    Σε ευχαριστώ παρα πολύ για το χρόνο σου!

     


    Αυτοί που ζουν γενναίοι είναι ενάρετοι,κάνουν ένδοξες πράξεις και πέθαινουν αιώνια ξακουστοί....
    Μ.Αλέξανδρος...IV Crusade...
  •  16-11-2007, 19:38 37390 σε απάντηση της 37389

    Απ: Βοήθεια Σχετικά με Procedure

    Μια άλλη λύση είναι να χρησιμοποιηθούν read only combo boxes για την επιλογή των παραμέτρων ώστε να αποφευχθει η εισαγωγή εσφαλμένης παραμέτρου και έπειτα μέσα στην procedure να εκτελειται η εντολή με dynamic queries....

     

    Συμφωνείτε ή βρίσκετε κάτι λάθος?

    Αν και εγώ βρίσκω λάθος οτι και πάλι έχεις περιορισμένο αριθμό παραμέτρων δλδ όσα θα είναι και τα combo boxes που θα βάλεις στην εφαρμογή..Μάλλον είναι βλακεία!Τι λέτε?


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