sql >> データベース >  >> RDS >> Sqlserver

スカラー変数を宣言する必要があります

    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インジェクションにさらされることになります(これとこれを参照してください:

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


    1. SQL、データを更新する方法

    2. MySQLでピボットテーブルの出力を返すにはどうすればよいですか?

    3. データベーステーブルのソート順列の使用

    4. MySQLテーブル列に名前を付けるために番号を使用できますか?