@RowFrom int
@RowTo int
são ambos Parâmetros Globais de Entrada para o Stored Procedure, e como estou compilando a consulta SQL dentro do Stored Procedure com T-SQL então utilizando Exec(@sqlstatement)
no final do stored procedure para mostrar o resultado, ele me dá este erro quando eu tento utilizar o @RowFrom
ou @RowTo
dentro da variável @sqlstatement
que é executada... funciona bem caso contrário... por favor, ajude-me.
"Must declare the scalar variable "@RowFrom"."
Além disso, tentei incluir o seguinte na variável `@sqlstatement':
'Declare @Rt int'
'SET @Rt = ' + @RowTo
mas @RowTo
ainda não'não passa seu valor para @Rt
e gera um erro.
Você pode't concatenar uma int com uma corda. Em vez de:
SET @sql = N'DECLARE @Rt INT; SET @Rt = ' + @RowTo;
Você precisa:
SET @sql = N'DECLARE @Rt INT; SET @Rt = ' + CONVERT(VARCHAR(12), @RowTo);
Para ajudar a ilustrar o que's está acontecendo aqui. Let's say @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;
Para construir isso em uma cadeia (mesmo que no final seja um número), eu preciso convertê-lo. Mas como você pode ver, o número ainda é tratado como um número quando ele's é executado. A resposta é 25, certo?
No seu caso você não'não precisa realmente de redeclarar @Rt etc. dentro da string @sql, você só precisa de dizer:
SET @sql = @sql + ' WHERE RowNum BETWEEN '
+ CONVERT(VARCHAR(12), @RowFrom) + ' AND '
+ CONVERT(VARCHAR(12), @RowTo);
Embora fosse melhor ter uma parametrização adequada, por exemplo
SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';
EXEC sp_executesql @sql,
N'@RowFrom INT, @RowTo INT',
@RowFrom, @RowTo;
Só para sua informação, eu sei que este é um post antigo, mas dependendo das configurações de COLHAÇÃO da base de dados, você pode obter este erro em uma declaração como esta,
SET @sql = @Sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';
se, por exemplo, você digitar o S no
SET @sql = @***S***ql
Desculpem por ter desviado as respostas já aqui publicadas, mas esta é uma instância real do erro relatado.
Note também que o erro não mostrará o S maiúsculo na mensagem, não sei bem porquê, mas acho que é porque o
Set @sql =
está à esquerda do sinal de igualdade.
A sensibilidade do caso também vai causar este problema.
@MyVariable e @myvariable são as mesmas variáveis no SQL Server Man. Studio e vai funcionar. Entretanto, estas variáveis resultarão em um "Deve declarar a variável escalar "@MyVariable" no Visual Studio (C#) devido a diferenças de sensibilidade a maiúsculas e minúsculas.