Debe declarar la variable escalar

@RowFrom int

@RowTo int

son ambos Parámetros Globales de Entrada para el Procedimiento Almacenado, y como estoy compilando la consulta SQL dentro del Procedimiento Almacenado con T-SQL y luego usando Exec(@sqlstatement) al final del procedimiento almacenado para mostrar el resultado, me da este error cuando trato de usar el @RowFrom o @RowTo dentro de la variable @sqlstatement que se ejecuta.. funciona bien de otra manera.. por favor ayuda.

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

Además, he probado a incluir lo siguiente en la variable @sqlstatement:

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

pero @RowTo sigue sin pasar su valor a @Rt y genera un error.

Solución

No se puede concatenar un int con una cadena. En lugar de:

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

Necesitas:

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

Para ayudar a ilustrar lo que sucede aquí. Digamos que @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;

Con el fin de construir que en una cadena (incluso si en última instancia, será un número), tengo que convertirlo. Pero como puede ver, el número sigue siendo tratado como un número cuando se ejecuta. La respuesta es 25, ¿verdad?

En tu caso realmente no necesitas volver a declarar @Rt etc. dentro de la cadena @sql, sólo tienes que decir:

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

Aunque sería mejor tener una parametrización adecuada, por ejemplo

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

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

Para que sepas, sé que este es un post antiguo, pero dependiendo de la configuración de la base de datos COLLATION puedes obtener este error en una declaración como esta,

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

si, por ejemplo, se escribe la S en el

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

perdón por desviar las respuestas ya publicadas aquí, pero este es un caso real del error reportado.

Tenga en cuenta también que el error no mostrará la S mayúscula en el mensaje, no estoy seguro de por qué, pero creo que es porque el

Set @sql =

está a la izquierda del signo de igualdad.

Comentarios (1)

La sensibilidad a las mayúsculas y minúsculas también causará este problema.

@MyVariable y @myvariable son las mismas variables en SQL Server Man. Studio y funcionarán. Sin embargo, estas variables resultarán en un "Debe declarar la variable escalar "@MyVariable" en Visual Studio (C#) debido a las diferencias de sensibilidad a las mayúsculas y minúsculas.

Comentarios (0)