@RowFrom int
@RowTo int
son parámetros de entrada globales para el procedimiento almacenado, y dado que estoy compilando la consulta SQL dentro del procedimiento almacenado con T-SQL y luego uso Exec(@sqlstatement)
al final del procedimiento almacenado para mostrar el resultado, me da este error cuando intento usar el @RowFrom
o @RowTo
dentro de la @sqlstatement
variable que se ejecuta .. funciona bien de lo contrario .. por favor ayuda.
"Must declare the scalar variable "@RowFrom"."
Además, intenté incluir lo siguiente en la @sqlstatement
variable:
'Declare @Rt int'
'SET @Rt = ' + @RowTo
pero @RowTo
todavía no pasa su valor @Rt
y genera un error.
sql
sql-server
stored-procedures
cuenta
fuente
fuente
GO
provoca una nueva rama donde las variables declaradas no son visibles más allá de la declaración.Respuestas:
No puedes concatenar un int a una cadena. En vez 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 está sucediendo aquí. Digamos @RowTo = 5.
DECLARE @RowTo int; SET @RowTo = 5; DECLARE @sql nvarchar(max); SET @sql = N'SELECT ' + CONVERT(varchar(12), @RowTo) + ' * 5'; EXEC sys.sp_executesql @sql;
Para construir eso en una cadena (incluso si finalmente será un número), necesito convertirlo. Pero como puede ver, el número todavía se trata como un número cuando se ejecuta. La respuesta es 25, ¿verdad?
En su caso, realmente no necesita volver a declarar @Rt, etc.dentro de la cadena @sql, solo necesita 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, p. Ej.
SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;'; EXEC sys.sp_executesql @sql, N'@RowFrom int, @RowTo int', @RowFrom, @RowTo;
fuente
@sql
variable se interprete correctamente comoNVARCHAR
: un requisito si usasp_executesql
...También puede obtener este mensaje de error si una variable se declara antes de una
GO
y se hace referencia a ella después.Vea esta pregunta y esta solución .
fuente
Solo para su información, sé que esta es una publicación antigua, pero dependiendo de la configuración de COLLACIÓN de la base de datos, puede obtener este error en una declaración como esta,
SET @sql = @Sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';
si, por ejemplo, escribe la S en el
SET @sql = @***S***ql
Lamento derivar las respuestas ya publicadas aquí, pero esta es una instancia real del error informado.
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 igual.
fuente
Solo agregué lo que lo solucionó para mí, donde el error ortográfico es el sospechoso según este blog de MSDN ...
Al dividir cadenas SQL en varias líneas, compruebe que está separando por comas su cadena SQL de sus parámetros (¡y no tratando de concatenarlos!) Y que no falte ningún espacio al final de cada línea dividida. No es ciencia espacial, pero espero ahorrarle a alguien un dolor de cabeza.
Por ejemplo:
db.TableName.SqlQuery( "SELECT Id, Timestamp, User " + "FROM dbo.TableName " + "WHERE Timestamp >= @from " + "AND Timestamp <= @till;" + [USE COMMA NOT CONCATENATE!] new SqlParameter("from", from), new SqlParameter("till", till)), .ToListAsync() .Result;
fuente
La sensibilidad a mayúsculas y minúsculas también provocará este problema.
@MyVariable y @myvariable son las mismas variables en SQL Server Man. Studio y funcionará. Sin embargo, estas variables darán como resultado un "Debe declarar la variable escalar" @MyVariable "en Visual Studio (C #) debido a diferencias entre mayúsculas y minúsculas.
fuente
Solo una respuesta para mi futuro (¡quizás también ayude a alguien más!). Si intenta ejecutar algo como esto en el editor de consultas:
USE [Dbo] GO DECLARE @RC int EXECUTE @RC = [dbo].[SomeStoredProcedure] 2018 ,0 ,'arg3' GO SELECT month, SUM(weight) AS weight, SUM(amount) AS amount FROM SomeTable AS e WHERE year = @year AND type = 'M'
Y obtienes el error:
Esto se debe a que se trata de abrir un montón de código que incluye AMBOS la ejecución del procedimiento almacenado y la consulta por debajo de ella (!). Simplemente resalte el que desea ejecutar o elimine / comente el que no le interesa.
fuente
Si alguien más se encuentra con esta pregunta mientras ninguna solución aquí hizo que mi archivo sql funcionara, aquí está mi error:
He estado exportando el contenido de mi base de datos a través del comando 'Generate Script' de Microsofts 'Server Management Studio y luego realicé algunas operaciones mientras insertaba los datos generados en otra instancia.
Debido a la exportación generada, ha habido un montón de declaraciones "GO" en el archivo sql.
Lo que no sabía era que las variables declaradas en la parte superior de un archivo no son accesibles hasta donde se ejecuta una declaración GO. Por lo tanto, tuve que eliminar las declaraciones GO en mi archivo sql y desapareció el error "Debe declarar la variable escalar xy".
fuente
Lo más probable es que esto no sea una respuesta al problema en sí, pero esta pregunta aparece como primer resultado al buscar, por lo
Sql declare scalar variable
tanto, comparto una posible solución a este error.En mi caso, este error fue causado por el uso de
;
después de una declaración SQL. Simplemente elimínelo y el error desaparecerá.Supongo que la causa es la misma que @IronSean ya publicó en un comentario anterior:
Por ejemplo:
DECLARE @id int SET @id = 78 SELECT * FROM MyTable WHERE Id = @var; <-- remove this character to avoid the error message SELECT * FROM AnotherTable WHERE MyTableId = @var
fuente