必须声明标量变量

新手上路,请多包涵

@RowFrom int

@RowTo int

都是存储过程的全局输入参数,并且由于我正在使用 T-SQL 编译存储过程中的 SQL 查询,然后在存储过程的末尾使用 Exec(@sqlstatement) 来显示结果,它给了我当我尝试在 --- @sqlstatement 执行的变量中使用 @RowFrom@RowTo 时出现此错误。否则它工作正常。请帮助。

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


另外,我尝试在 @sqlstatement 变量中包含以下内容:

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

但是 @RowTo 仍然没有将其值传递给 @Rt 并产生错误。

原文由 bill 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

您不能将 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 sys.sp_executesql @sql;

为了将它构建成一个字符串(即使最终它将是一个数字),我需要将它转换。但是正如你所看到的,该数字在执行时仍然被视为一个数字。答案是25,对吧?

在您的情况下,您可以使用适当的参数化而不是使用连接,如果您养成这种习惯,您将在某些时候将自己暴露在 SQL 注入中(请参阅 thisthis

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

EXEC sys.sp_executesql @sql,
  N'@RowFrom int, @RowTo int',
  @RowFrom, @RowTo;

原文由 Aaron Bertrand 发布,翻译遵循 CC BY-SA 4.0 许可协议

https://learn.microsoft.com/en-us/sql/t-sql/language-elements/sql-server-utilities-statements-go?view=sql-server-ver16 中所述,用户的范围-定义的变量是批次相关的。

–这将产生错误

 GO
    DECLARE @MyVariable int;
    SET @MyVariable = 1;
    GO --new batch of code
    SELECT @MyVariable--CAST(@MyVariable AS
    int);
 GO

–这不会产生错误

 GO
   DECLARE @MyVariable int;
   SET @MyVariable = 1;
   SELECT @MyVariable--CAST(@MyVariable AS int);
 GO

当我们尝试在动态 SQL 中传递变量时,我们会遇到同样的错误:

 GO
DECLARE @ColumnName VARCHAR(100),
        @SQL NVARCHAR(MAX);
SET @ColumnName = 'FirstName';
EXECUTE ('SELECT [Title],@ColumnName FROM Person.Person');
GO

–在上面的情况下,@ColumnName 无处可寻,因此我们可以这样做:

 EXECUTE ('SELECT [Title],' +@ColumnName+ ' FROM Person.Person');

或者

GO
DECLARE @ColumnName VARCHAR(100),
        @SQL NVARCHAR(MAX);
SET @ColumnName = 'FirstName';
SET @SQL = 'SELECT ' + @ColumnName + ' FROM Person.Person';
EXEC sys.sp_executesql @SQL
GO

原文由 Mihnea Andrei Ciorica 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进