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 είναι εντελώς ασφαλής και έχω τον πλήρη έλεγχο.