@RowFrom int
@RowTo int
両方ともストアドプロシージャのグローバル入力パラメータであり、T-SQLを使用してストアドプロシージャ内のSQLクエリをコンパイルし、ストアドプロシージャの最後でExec(@sqlstatement)
を使用して結果を表示しているため、実行される@RowFrom
変数内で@RowTo
または@sqlstatement
を使用してください。それ以外の場合は問題なく動作します。
"Must declare the scalar variable "@RowFrom"."
また、@sqlstatement
変数に以下を含めてみました:
'Declare @Rt int'
'SET @Rt = ' + @RowTo
しかし、@RowTo
はまだ値を@Rt
に渡さず、エラーを生成します。
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 sp_executeSQL @sql;
それを文字列に(最終的には数字になっても)構築するには、変換する必要があります。しかし、ご覧のとおり、数値は実行時に数値として扱われます。答えは25ですよね?
あなたの場合、@ sql文字列内で@Rtなどを再宣言する必要は本当にありません。
SET @sql = @sql + ' WHERE RowNum BETWEEN '
+ CONVERT(VARCHAR(12), @RowFrom) + ' AND '
+ CONVERT(VARCHAR(12), @RowTo);
ただし、適切なパラメータ化を行う方が良いでしょう。
SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';
EXEC sp_executesql @sql,
N'@RowFrom INT, @RowTo INT',
@RowFrom, @RowTo;
ちなみに、これは古い投稿であることは知っていますが、データベースの収集設定によっては、このようなステートメントでこのエラーが発生する可能性があります。
SET @sql = @Sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';
たとえば、Sをタイプミスした場合
SET @sql = @***S***ql
ここに既に投稿されている回答をスピンオフして申し訳ありませんが、これは報告されたエラーの実際のインスタンスです。
また、エラーではメッセージに大文字のSが表示されないことに注意してください。理由はわかりませんが、
Set @sql =
等号の左側にあります。
このMSDNブログ ...にあるように、スペルミスが疑われる場合、それを修正したものを追加するだけです.
SQL文字列を複数の行に分割するときは、SQL文字列とパラメーターをコンマで区切って(連結しようとしないで!)、各分割行の最後にスペースがないことを確認してください。ロケット科学ではなく、誰かが頭痛の種を救うことを願っています。
例えば:
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;
大文字と小文字の区別もこの問題を引き起こします。
@MyVariableと@myvariableは、SQL Server Manの同じ変数です。スタジオと動作します。ただし、これらの変数は、大文字と小文字の区別の違いにより、Visual Studio(C#)で「@MyVariable」というスカラー変数を宣言する必要があります。