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

 

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

execute(sqlquery)

Îåêßíçóå áðü ôï ìÝëïò Hector. Τελευταία δημοσίευση από το μέλος KelMan στις 30-09-2008, 13:01. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  29-09-2008, 16:38 44972

    execute(sqlquery)

    Καλησπέρα σε όλους.

    Θα είμαι σύντομος.

    Έχω μία procedure που χτίζει μία παράμετρο πχ @cmd σύμφωνα με κάποια κριτήρια και στο τέλος καλείται η execute(@cmd). Η @cmd είναι πάντα της μορφής "select count(*) ...".

    Πώς μπορώ να επιστρέψω σε άλλη μεταβλητή το αποτέλεσμα του execute(@cmd) ???

    Ευχαριστώ προκαταβολικά.
    Δημοσίευση στην κατηγορία:
  •  29-09-2008, 17:57 44974 σε απάντηση της 44972

    Απ: execute(sqlquery)

    Με την EXECUTE δεν μπορείς να κάνεις κάτι τέτοιο. Μπορείς όμως με την sp_executesql. Παράδειγμα από books on line:

    DECLARE @IntVariable int;
    DECLARE @SQLString nvarchar(500);
    DECLARE @ParmDefinition nvarchar(500);
    DECLARE @max_title varchar(30);

    SET @IntVariable = 197;
    SET @SQLString = N'SELECT @max_titleOUT = max(Title) 
                       FROM AdventureWorks.HumanResources.Employee
                       WHERE ManagerID = @level'
    ;
    SET @ParmDefinition = N'@level tinyint, @max_titleOUT varchar(30) OUTPUT';

    EXECUTE sp_executesql @SQLString, @ParmDefinition, @level = @IntVariable, @max_titleOUT=@max_title OUTPUT;
    SELECT @max_title;


    Vir prudens non contra ventum mingit
  •  29-09-2008, 22:58 44978 σε απάντηση της 44972

    Απ: execute(sqlquery)

    Το να δημιουργείς και να εκτελείς ένα SQL string είναι αρκετά επικίνδυνο καθώς σε εκθέτει σε SQL Injection attacks. Αν δεν ελέγχεις τις παραμέτρους που χρησιμοποιείς για να χτίσεις το string μπορεί κάποιος χρήστης να ενσωματώσει εκτελέσιμη SQL μέσα στο δικό σου string και να κάνει αρκετή ζημιά. Μήπως μπορείς να φτιάξεις ένα και μόνο query το οποίο θα παίρνει παραμέτρους αντί να χτίζεις το δικό σου?


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  30-09-2008, 12:33 44994 σε απάντηση της 44974

    Απ: execute(sqlquery)

    KelMan:

    Με την EXECUTE δεν μπορείς να κάνεις κάτι τέτοιο. Μπορείς όμως με την sp_executesql. Παράδειγμα από books on line:

    DECLARE @IntVariable int;
    DECLARE @SQLString nvarchar(500);
    DECLARE @ParmDefinition nvarchar(500);
    DECLARE @max_title varchar(30);

    SET @IntVariable = 197;
    SET @SQLString = N'SELECT @max_titleOUT = max(Title) 
                       FROM AdventureWorks.HumanResources.Employee
                       WHERE ManagerID = @level'
    ;
    SET @ParmDefinition = N'@level tinyint, @max_titleOUT varchar(30) OUTPUT';

    EXECUTE sp_executesql @SQLString, @ParmDefinition, @level = @IntVariable, @max_titleOUT=@max_title OUTPUT;
    SELECT @max_title;



    Ευχαριστώ για την παράθεση του κώδικα. Το πρόβλημα είναι πως το query μου είναι κάθε φορά σταθερό, δεν έχει μεταβλητές μέσα (βλ. @level).
    Όταν πάω να καλέσω την sp_executesql μου χτυπάει το εξής :
    Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1
    Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.

    Καμιά ιδέα?


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

    Το να δημιουργείς και να εκτελείς ένα SQL string είναι αρκετά επικίνδυνο καθώς σε εκθέτει σε SQL Injection attacks. Αν δεν ελέγχεις τις παραμέτρους που χρησιμοποιείς για να χτίσεις το string μπορεί κάποιος χρήστης να ενσωματώσει εκτελέσιμη SQL μέσα στο δικό σου string και να κάνει αρκετή ζημιά. Μήπως μπορείς να φτιάξεις ένα και μόνο query το οποίο θα παίρνει παραμέτρους αντί να χτίζεις το δικό σου?



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


  •  30-09-2008, 13:01 44996 σε απάντηση της 44994

    Απ: execute(sqlquery)

    Δοκίμασες να αφαιρέσεις ότι έχει να κάνει με την @level;

    DECLARE @SQLString nvarchar(500);
    DECLARE @ParmDefinition nvarchar(500);
    DECLARE @max_title varchar(30);

    SET @SQLString = N'SELECT @max_titleOUT = max(Title) 
                       FROM AdventureWorks.HumanResources.Employee'
    ;
    SET @ParmDefinition = N'@max_titleOUT varchar(30) OUTPUT'
    ;

    EXECUTE sp_executesql @SQLString, @ParmDefinition, @max_titleOUT=@max_title OUTPUT;
    SELECT @max_title;

    Επίσης, στη σελίδα που σου έδωσα το link έχει πλήρη επεξήγηση του πως δουλεύει η sp_executesql, τη διάβασες;


    Vir prudens non contra ventum mingit
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems