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

 

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

help με IF σε Stored Proc

Îåêßíçóå áðü ôï ìÝëïò Johnnyxp64. Τελευταία δημοσίευση από το μέλος Johnnyxp64 στις 23-01-2011, 02:02. Υπάρχουν 15 απαντήσεις.
Σελίδα 1 από 2 (16 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  21-01-2011, 13:33 62562

    help με IF σε Stored Proc

    καλημερα

    θελω να ρωτησω πως μπορω να εχω σε stored procedure IF που να μου αλλαζει ενα where βαση καποιας τιμης που περνει απο parameter?
    και επιδει το λεω χαλια θα κανω παραδειγμα

    εχω ενα πινακα με 3 πεδια (τυχαιο παραδειγμα)
    table name:users

    ID
    Name
    Phone



    θελω ενα SP που θα εχει για παραμετρο το @Phone και αν ο χρηστης δωσει την λεξη "any" παραδειγμα το SP
    να εκτελει ενα απλο select αλλα με where 

    1)Phone=@Phone

    ή

    2)Phone<>'0'



    CREATE PROCEDURE [test]

    @phone varchar(30)

    AS
    Select * from users where Phone=@Phone

    φανταζομαι καπου πρεπει να γραψω κατι σαν 
    If @phone='any'
    Begin
    ............................
    else
    ..........................
    End

    θελω να αλλαζω τον Τελεστή!
    πως όμως? μπορω να εχω "δυναμικο" Where που θα το απαρτίζουν πολλα τετοια κριτηρια και ολα μαζι να συντασουν ενα σωστο Where και να "κολα" στο query και να τρεχει σωστα?

    παρακαλω για τα φωτα σας Smile
    tnx


    p.s αμα γραψω if και για καθε περιπτωση απλα εκτελω το query Μου με αλλο where παιζει, αλλα το ερωτημα ειναι οτι δεν μπορω να εχω ενα select διοτι θα ειναι μακρι και δεν θα ηθελα να συντηρω 4-5 ερωτηματα με copy paste....λεω μπας και μπορει να γινει ποιο "εξυπνο".
    ισως η σωστη ορολογια ειναι "concatenate stored procedure parameters"?



    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  21-01-2011, 15:30 62564 σε απάντηση της 62562

    Απ: help με IF σε Stored Proc

    Κάτι τέτοιο θα σε βοηθήσει να λύσεις το πρόβλημα σου.

     

    case when (@phone<>'any' then select * from users where phone = @phone

                                              else select * from users where phone <> 0

                      )

  •  21-01-2011, 15:34 62565 σε απάντηση της 62564

    Απ: help με IF σε Stored Proc

    μα οπως ειπα αυτο το εχω κανει το θεμα ειναι αν μπορω να αποφυγω το ναγραφω πολλα queries 
    βασικα ειναι μεγα λαθος να το κανω αυτο διοτι εχω ενα σωρο παραμετρους και πιθανοτητες δεν μπορω να κανω 1ερωτημα για καθε περιπτωση!

    πρεπει να ειναι κατι concatenate που θα εκτελεστει στο τελος ολο μαζι μια και καληTongue Tied

    βρηκα κατι και νομιζω ειμαι κοντα αλλα το μονο (γελιο ισως) ειναι πως διαολο λεω σε stored procedure να εκτελεστη η @query που εχω φτιαξει μετα την ενωση των παραμετρων?Big Smile

    λιγο το τελος πως να τρεξει αυτο το ριμαδι αν μπορει καποιος να βοηθησει.....πριν φαω αλλες 3 ωρες ψαχνωντας Sad
    IF OBJECTPROPERTY(object_id('dbo.usp_test'), N'IsProcedure') = 1
    DROP PROCEDURE [dbo].[usp_test]
    GO
    CREATE PROCEDURE [usp_test]
    
    @Course varchar(max),
    @Pass varchar(max)
    
    AS
    
    Declare @query varchar(max)
       Set @query = 'Select * From users Where '
    
       If @Course='admin'
       Begin
        Set @query = @query + 'Code=''Admin''' 
        end
        else
        begin
        Set @query = @query + 'Code<>''Admin''' 
       end
    
       If @Pass ='any'
       Begin
        Set @query = @query + ' and Password <>-1'
        end
        else
        begin
        Set @query = @query + ' and Password = '''+@Pass +''''
        end
    
    go 




    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  21-01-2011, 15:43 62566 σε απάντηση της 62565

    Απ: help με IF σε Stored Proc

    EXECUTE sp_executesql @query

     

    ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/a8d68d72-0f4d-4ecb-ae86-1235b962f646.htm

  •  21-01-2011, 15:53 62567 σε απάντηση της 62566

    Απ: help με IF σε Stored Proc

    χιλια ευχαριστω.....

    αλλα
    Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1
    Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.

    οταν παω να την τρεξω με 

    exec [usp_test] 'admin' ,'any'
    Big Smile


    Update:
    βρηκα το λαθος

    Declare @query nvarchar(MAX)


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  21-01-2011, 16:07 62568 σε απάντηση της 62567

    Απ: help με IF σε Stored Proc

    final test sample

    IF OBJECTPROPERTY(object_id('dbo.usp_test'), N'IsProcedure') = 1
    DROP PROCEDURE [dbo].[usp_test]
    GO
    CREATE PROCEDURE [usp_test]
    
    @Course nvarchar(max),
    @Pass nvarchar(max)
    
    AS
    
    Declare @query nvarchar(MAX)
       Set @query = 'Select * From users Where '
    
       If @Course='admin'
       Begin
        Set @query = @query + 'Code=''Admin''' 
        end
        else
        begin
        Set @query = @query + 'Code<>''Admin''' 
       end
    
       If @Pass ='any'
       Begin
        Set @query = @query + ' and Password <>''-1''' /* + Convert(nvarchar(max), @Pass ) */
        end
        else
        begin
        Set @query = @query + ' and Password ='+@Pass+''
        end
    
    EXECUTE sp_executesql @query
    
    go


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  21-01-2011, 16:26 62573 σε απάντηση της 62568

    Απ: help με IF σε Stored Proc

    Η stored procedure που εγραψες ειναι τρωτη σε sql injection :

    exec [usp_test] @Course = 'admin', @Pass = ' ''1'' or 1=1'
    exec [usp_test] @Course = 'admin', @Pass = 'Password'

    --HTH--

  •  21-01-2011, 16:42 62574 σε απάντηση της 62573

    Απ: help με IF σε Stored Proc

    Για δοκίμασε αυτό

     

    IF OBJECTPROPERTY(object_id('dbo.usp_test'), N'IsProcedure') = 1

    DROP PROCEDURE [dbo].[usp_test]

    GO

    CREATE PROCEDURE [usp_test]

    @Course varchar(max),

    @username varchar(max),

    @Password varchar(max),

    @Pass varchar(max)

    AS

    Declare @query varchar(max)

    DECLARE @ParmDefinition nvarchar(500)

    Set @query = 'Select * From users Where '

    If @Course='admin'

    Begin

    set @username = @Course

    Set @query = @query + 'Code='+@Course

    end

    else

    begin

    set @username = @Course

    Set @query = @query + 'Code<>'+@Course

    end

    If @Pass ='any'

    Begin

    set @Password = '-1'

    Set @query = @query + ' and Password <>'+@Pass

    end

    else

    begin

    set @Password = @Pass

    Set @query = @query + ' and Password = '''+@Pass +'''' /* + Convert(varchar(10), @Branch ) */

    end

    SET @ParmDefinition = N'@Course varchar(max)',N'@Pass varchar(max)';

    EXECUTE sp_executesql @SQLString, @ParmDefinition,@Course=@username,@Pass=@Password

    go

  •  21-01-2011, 17:25 62575 σε απάντηση της 62574

    Απ: help με IF σε Stored Proc

    Η όλη αναζήτηση είναι λάθος εξαρχής. Πέρα από το θέμα του sql injection, όπως σωστά είπε και ο spaceman, το stored procedure θα έχει και κακό performance. Ο SQL Server δημιουργεί το execution plan ενός stored procedure την πρώτη φορά που αυτό εκτελείται και μετά το ξαναχρησιμοποιεί. Ένα query χωρίς where έχει τελείως διαφορετικό execution plan από ένα query που έχει where στο πεδίο Α και διαφορετικό από ένα που έχει στο πεδίο Β. Αν εκτελέσεις διαφορετικό query τη μία φορά και διαφορετικό τη δεύτερη μέσα από το ίδιο stored procedure , το δεύτερο execution θα δοκιμάσει να χρησιμοποιήσει το execution plan που δημιουργήθηκε στο πρώτο. Μπορείς μεν να ορίσεις να γίνεται compile το stored procedure κάθε φορά που το τρέχεις, έτσι όμως χάνεις κάθε όφελος ταχύτητας το οποίο θα σου έδιναν τα stored procedures.

    Αν θέλεις να εκτελέσεις query με διαφορετικούς τελεστές, απλά φτιάξες διαφορετικά stored procedures, ή εκτέλεσε απευθείας το SQL. Και φρόντισε να χρησιμοποιείς παραμέτρους, όχι string concatenations.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  21-01-2011, 17:34 62577 σε απάντηση της 62574

    Απ: help με IF σε Stored Proc

    βασικα παιδια δεν θα ειναι τροτο γιατι οι τιμες ολες θα ειναι απο dropdown μενου standar δεν θα μπορει να πληκτρολογει ο χρηστης κατι που θα αποβει μοιραιο!
    παρο ολα αυτα ομως δοκιμασα την 2λυση αλλα τρωω ενα κουλο

    Msg 102, Level 15, State 1, Procedure usp_test, Line 33
    Incorrect syntax near ','.

    και ετσι οπως εχω τον κωδιακ μα το θεο στην γραμμη 33 ΔΕΝ εχει ΤΙΠΟΤΑ! κενο! κοιταξα ολα τα , μπας και καποιο αλλου χτυπα δεν εβγαλα ακρη ακομα

    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  21-01-2011, 17:40 62578 σε απάντηση της 62575

    Απ: help με IF σε Stored Proc

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

    Η όλη αναζήτηση είναι λάθος εξαρχής. Πέρα από το θέμα του sql injection, όπως σωστά είπε και ο spaceman, το stored procedure θα έχει και κακό performance. Ο SQL Server δημιουργεί το execution plan ενός stored procedure την πρώτη φορά που αυτό εκτελείται και μετά το ξαναχρησιμοποιεί. Ένα query χωρίς where έχει τελείως διαφορετικό execution plan από ένα query που έχει where στο πεδίο Α και διαφορετικό από ένα που έχει στο πεδίο Β. Αν εκτελέσεις διαφορετικό query τη μία φορά και διαφορετικό τη δεύτερη μέσα από το ίδιο stored procedure , το δεύτερο execution θα δοκιμάσει να χρησιμοποιήσει το execution plan που δημιουργήθηκε στο πρώτο. Μπορείς μεν να ορίσεις να γίνεται compile το stored procedure κάθε φορά που το τρέχεις, έτσι όμως χάνεις κάθε όφελος ταχύτητας το οποίο θα σου έδιναν τα stored procedures.

    Αν θέλεις να εκτελέσεις query με διαφορετικούς τελεστές, απλά φτιάξες διαφορετικά stored procedures, ή εκτέλεσε απευθείας το SQL. Και φρόντισε να χρησιμοποιείς παραμέτρους, όχι string concatenations.


    Παναγιωτη αυτο δεν ειναι αφικτο
    ποιο?
    να κανω πολα μικρα SP γι ακαθε περιπτωση (εκτος και αν δεν το καταλαβα σωστα)
    αλλα ουτε να το τρεξει καποιος απευθειας δεν θελουμε!

    θελω sp να μην γνωριζει ο προγραμματιστης που θα το καλεσει με παραμετρους των κωδικα του sp και τι ψαχνει ακριβως μεσα στην βαση για αλλους λογους!

    θελω να του πω, να παρε αυτο καλεσεται απο οτι γλωσα θες (βασικα θα ειναι web) και με τις παραμετρους αυτες και παρε αποτελεσματα. δεν θελω να γνωριζει επιπλεον πραγματα!
    τελος για να καταλαβω λες οτι θα εχει κακο performance αλλα παρο αλα αυτα τα αποτελεσματα θα ειναι σωστα παντα! δεν πειραζει το performance δεν ειναι κατι τοσο συμαντικο!
    αντε να το καλουν ταυτοχρονα 3ατομα την ημερα και αν! 

    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  21-01-2011, 18:42 62581 σε απάντηση της 62578

    Απ: help με IF σε Stored Proc

    Johnnyxp64:

    θελω να του πω, να παρε αυτο καλεσεται απο οτι γλωσα θες (βασικα θα ειναι web) και με τις παραμετρους αυτες και παρε αποτελεσματα. δεν θελω να γνωριζει επιπλεον πραγματα!
    τελος για να καταλαβω λες οτι θα εχει κακο performance αλλα παρο αλα αυτα τα αποτελεσματα θα ειναι σωστα παντα! δεν πειραζει το performance δεν ειναι κατι τοσο συμαντικο!

    CREATE PROCEDURE dbo.usp_test1
    @Course nvarchar(max),
    @Pass nvarchar(max)
    AS 
    BEGIN
    	SELECT *
    	FROM dbo.users
    	WHERE ((@Course = N'admin' AND Code = N'admin') OR (@Course <> N'admin' AND Code <> N'admin')) 
    	  AND ((@Pass = N'any' AND Password <> N'-1') OR (@Pass <> N'any' AND Password = @Pass))
    END

    --ΗΤΗ--

  •  21-01-2011, 18:52 62583 σε απάντηση της 62578

    Απ: help με IF σε Stored Proc

    Ο κακός κώδικας είναι πάντα κακός κώδικας. Το ότι "δεν σε νοιάζει το performance" δεν δικαιολογεί να γράφεις κακό κώδικα. Δες απλά πόσο απλό και καθαρό είναι το query που έγραψε ο spaceman. Είναι πολύ απλούστερο, ευκολότερο, ασφαλέστερο και γρηγορότερο από τα IF και τα concatenations. 

    Επιπλέον, το ότι οι τιμές προέρχονται από combo δεν σημαίνει τίποτε απολύτως. Μήπως οι τιμές που μπαίνουν στο combo είναι παραμέτρικες? Πού ορίζονται? Μήπως από το χρήστη? Και αν ο χρήστης πάει και κολλήσει κάτι έξυπνο? Αν δώσει π.χ. '-->' επειδή ήθελε να βάλει ένα βελάκι? Αν ΕΣΥ το κάνεις αυτό? Είσαι σίγουρος ότι ακόμα και εσύ θα θυμάσαι που καταλήγουν οι τιμές του combo μετά από μία εβδομάδα? 

    Άνετα μπορείς να γράψεις statements  με παραμέτρους χωρίς να "κολλάς" τις τιμές. Ο κώδικας και απλούστερος θα είναι και γρηγορότερος.

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  21-01-2011, 19:30 62585 σε απάντηση της 62583

    Απ: help με IF σε Stored Proc

    Αν και διάβασα λίγο βιαστικά τη συζήτηση, μήπως θα βοηθούσε αυτό το αρθράκι που είχα γράψει το 2005(!) και δημοσιεύθηκε και στο SqlServerCentral.com;
    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  23-01-2011, 01:23 62613 σε απάντηση της 62583

    Απ: help με IF σε Stored Proc

    Παναγιώτης Καναβός:
    Ο κακός κώδικας είναι πάντα κακός κώδικας. Το ότι "δεν σε νοιάζει το performance" δεν δικαιολογεί να γράφεις κακό κώδικα. Δες απλά πόσο απλό και καθαρό είναι το query που έγραψε ο spaceman. Είναι πολύ απλούστερο, ευκολότερο, ασφαλέστερο και γρηγορότερο από τα IF και τα concatenations. 

    Επιπλέον, το ότι οι τιμές προέρχονται από combo δεν σημαίνει τίποτε απολύτως. Μήπως οι τιμές που μπαίνουν στο combo είναι παραμέτρικες? Πού ορίζονται? Μήπως από το χρήστη? Και αν ο χρήστης πάει και κολλήσει κάτι έξυπνο? Αν δώσει π.χ. '-->' επειδή ήθελε να βάλει ένα βελάκι? Αν ΕΣΥ το κάνεις αυτό? Είσαι σίγουρος ότι ακόμα και εσύ θα θυμάσαι που καταλήγουν οι τιμές του combo μετά από μία εβδομάδα? 

    Άνετα μπορείς να γράψεις statements  με παραμέτρους χωρίς να "κολλάς" τις τιμές. Ο κώδικας και απλούστερος θα είναι και γρηγορότερος.

    δεν υπαρχει προβλημα με το τι θα γραψει ο χρηστης δεν γραφει τιποτα και πουθενα. αυτο ειναι ξεκαθαρο
    τελος κι εγω μαζι σου για ποιο ασφαλη κωδικα αλλα ειναι και θεμα να δουλευει και να γραφτει και ευκολα-γρηγορα και ενω ο παραπανω κωδικας διχνει απλςο και καθαρος εχω τοσα μα τοσα parameters που ειναι αδυνατον να καθησω να γραψω 50+ συνδιαστηκες πιθανοτητες! και δεν θελω να το κανω γιατι δεν προλαβαινω και σιγουρα κατι θα μου ξεφυγει και θα φερει λαθος αποτελεσματα!

    το ερωτημα ειναι αν ο "κακος" κωδικας που ειναι ποιο δυναμικος και θελει μονο 7 if για μενα αν μπορω αυτο να το κανω ποιο ασφαλει με τον ιδιο ομως σκεπτικο! μην κολαμε τωρα στο performance και ανοιγου τετοιτες γενικες και θεωριτικες κουβεντες! αυτο μου ζητησαν σε αυτο το χρονο με αυτα τα λιγα, αυτο θα παρουν! τελος. δεν αποφασιζω εγω και μην βγαινουμε Offtopic,

    μπορειτε να μου δωσετε βοηθεια στο concat stored procedure να γινει λιγο ποιο ασφαλες (που και παλι δεν υπαρχει λογος) αλλα γιατι να μην το κανω σωστα.? αυτο μονο θελω παιδια! οχι αναλυση αν περνω την καλητερη ή οχι λυση! Θελω απλα μια γρηγορη και workable λυση! τιποτα αλλο! αν περνει βελτιωσει ο κωδικας μου ευχαριστω το θεμα εκλεισε αν οχι θα κρατησω αυτο για τωρα.

    ευχαριστω.

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