@RowFrom int
@RowTo int
είναι και οι δύο Global Input Params για τη Stored Procedure, και δεδομένου ότι συντάσσω το SQL ερώτημα μέσα στη Stored Procedure με T-SQL και στη συνέχεια χρησιμοποιώ το Exec(@sqlstatement)
στο τέλος της stored procedure για να εμφανίσω το αποτέλεσμα, μου δίνει αυτό το σφάλμα όταν προσπαθώ να χρησιμοποιήσω το @RowFrom
ή το @RowTo
μέσα στη μεταβλητή @sqlstatement
που εκτελείται.. δουλεύει μια χαρά αλλιώς.. παρακαλώ βοηθήστε.
"Must declare the scalar variable "@RowFrom"."
Επίσης, δοκίμασα να συμπεριλάβω τα ακόλουθα στη μεταβλητή @sqlstatement
:
'Declare @Rt int'
'SET @Rt = ' + @RowTo
αλλά η @RowTo
εξακολουθεί να μην περνάει την τιμή της στην @Rt
και παράγει σφάλμα.
Δεν μπορείτε να συνδέσετε ένα int με ένα αλφαριθμητικό. Αντί για:
SET @sql = N'DECLARE @Rt INT; SET @Rt = ' + @RowTo;
Χρειάζεστε:
SET @sql = N'DECLARE @Rt INT; SET @Rt = ' + CONVERT(VARCHAR(12), @RowTo);
Για να καταλάβετε τι συμβαίνει εδώ... Ας πούμε ότι @RowTo = 5.
DECLARE @RowTo INT;
SET @RowTo = 5;
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT ' + CONVERT(VARCHAR(12), @RowTo) + ' * 5';
EXEC sp_executeSQL @sql;
Για να το χτίσω αυτό σε μια συμβολοσειρά (ακόμα και αν τελικά θα είναι ένας αριθμός), πρέπει να το μετατρέψω. Αλλά όπως μπορείτε να δείτε, ο αριθμός εξακολουθεί να αντιμετωπίζεται ως αριθμός όταν εκτελείται. Η απάντηση είναι 25, σωστά;
Στην περίπτωσή σας δεν χρειάζεται πραγματικά να επαναδηλώσετε το @Rt κ.λπ. μέσα στο @sql string, απλά πρέπει να πείτε:
SET @sql = @sql + ' WHERE RowNum BETWEEN '
+ CONVERT(VARCHAR(12), @RowFrom) + ' AND '
+ CONVERT(VARCHAR(12), @RowTo);
Αν και θα ήταν καλύτερο να έχετε κατάλληλη παραμετροποίηση, π.χ.
SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';
EXEC sp_executesql @sql,
N'@RowFrom INT, @RowTo INT',
@RowFrom, @RowTo;
Απλά για να ξέρετε, ξέρω ότι αυτό είναι ένα παλιό μήνυμα, αλλά ανάλογα με τις ρυθμίσεις COLLATION της βάσης δεδομένων μπορεί να λάβετε αυτό το σφάλμα σε μια δήλωση όπως αυτή,
SET @sql = @Sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';
αν για παράδειγμα πληκτρολογήσετε το S στην εντολή
SET @sql = @***S***ql
συγγνώμη που ξεφεύγω από τις απαντήσεις που έχουν ήδη αναρτηθεί εδώ, αλλά αυτή είναι μια πραγματική περίπτωση του σφάλματος που αναφέρθηκε.
Σημειώστε επίσης ότι το σφάλμα δεν θα εμφανίσει το κεφαλαίο S στο μήνυμα, δεν είμαι σίγουρος γιατί, αλλά νομίζω ότι είναι επειδή το
Set @sql =
βρίσκεται στα αριστερά του σημείου ισότητας.
Η ευαισθησία στην πεζότητα θα προκαλέσει επίσης αυτό το πρόβλημα.
Οι @MyVariable και @myvariable είναι οι ίδιες μεταβλητές στον SQL Server Man. Studio και θα λειτουργήσουν. Ωστόσο, αυτές οι μεταβλητές θα οδηγήσουν σε ένα "Must declare the scalar variable "@MyVariable" στο Visual Studio (C#) λόγω διαφορών στην ευαισθησία πεζών και κεφαλαίων.