Skaler değişkeni bildirmelidir

@RowFrom int

@RowTo int

her ikisi de Saklı Yordam için Global Giriş Parametreleridir ve SQL sorgusunu T-SQL ile Saklı Yordam içinde derlediğimden ve ardından sonucu göstermek için saklı yordamın sonunda Exec(@sqlstatement) kullandığımdan, çalıştırılan @sqlstatement değişkeninin içinde @RowFrom veya @RowTo kullanmaya çalıştığımda bana bu hatayı veriyor. aksi takdirde iyi çalışıyor. lütfen yardım edin.

"Must declare the scalar variable "@RowFrom"."

Ayrıca, @sqlstatement değişkenine aşağıdakileri eklemeyi denedim:

'Declare @Rt int'
'SET @Rt = ' + @RowTo

ancak @RowTo hala değerini @Rtye aktarmıyor ve bir hata üretiyor.

Çözüm

Bir int ile bir dizeyi birleştiremezsiniz. Bunun yerine:

SET @sql = N'DECLARE @Rt INT; SET @Rt = ' + @RowTo;

İhtiyacın var:

SET @sql = N'DECLARE @Rt INT; SET @Rt = ' + CONVERT(VARCHAR(12), @RowTo);

Burada neler olduğunu açıklamaya yardımcı olmak için. Diyelim ki @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;

Bunu bir dizeye dönüştürmek için (sonuçta bir sayı olacak olsa bile) dönüştürmem gerekiyor. Ancak gördüğünüz gibi, sayı çalıştırıldığında hala bir sayı olarak ele alınıyor. Cevap 25, değil mi?

Sizin durumunuzda @sql dizesi içinde @Rt vb. ifadeleri yeniden beyan etmenize gerek yoktur, sadece şunu söylemeniz yeterlidir:

SET @sql = @sql + ' WHERE RowNum BETWEEN ' 
    + CONVERT(VARCHAR(12), @RowFrom) + ' AND ' 
    + CONVERT(VARCHAR(12), @RowTo);

Yine de uygun parametrelendirmeye sahip olmak daha iyi olacaktır, örn.

SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';

EXEC sp_executesql @sql,
  N'@RowFrom INT, @RowTo INT',
  @RowFrom, @RowTo;
Yorumlar (4)

Bilginize, bunun eski bir gönderi olduğunu biliyorum, ancak veritabanı COLLATION ayarlarına bağlı olarak aşağıdaki gibi bir ifadede bu hatayı alabilirsiniz,

SET @sql = @Sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';

örneğin S harfini yazım hatası yaparsanız

SET @sql = @***S***ql 

Burada zaten yayınlanmış olan yanıtları saptırdığım için özür dilerim, ancak bu bildirilen hatanın gerçek bir örneğidir.

Ayrıca hatanın mesajda büyük S harfini göstermeyeceğini de unutmayın, nedeninden emin değilim, ancak sanırım bunun nedeni

Set @sql =

eşittir işaretinin solundadır.

Yorumlar (1)

Harf Hassasiyeti de bu soruna neden olacaktır.

SQL Server Man'de @MyVariable ve @myvariable aynı değişkenlerdir. Studio'da aynı değişkenlerdir ve çalışacaklardır. Ancak, bu değişkenler büyük/küçük harf duyarlılığı farklılıkları nedeniyle Visual Studio'da (C#) "@MyVariable" skaler değişkenini bildirmelidir.

Yorumlar (0)