Must declare the scalar variable

前端 未结 8 1297
小蘑菇
小蘑菇 2020-11-29 01:41

@RowFrom int

@RowTo int

are both Global Input Params for the Stored Procedure, and since I am compiling the SQL query inside the St

8条回答
  •  臣服心动
    2020-11-29 02:09

    You can't concatenate an int to a string. Instead of:

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

    You need:

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

    To help illustrate what's happening here. 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 sys.sp_executesql @sql;
    

    In order to build that into a string (even if ultimately it will be a number), I need to convert it. But as you can see, the number is still treated as a number when it's executed. The answer is 25, right?

    In your case you don't really need to re-declare @Rt etc. inside the @sql string, you just need to say:

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

    Though it would be better to have proper parameterization, e.g.

    SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';
    
    EXEC sys.sp_executesql @sql,
      N'@RowFrom int, @RowTo int',
      @RowFrom, @RowTo;
    

提交回复
热议问题