行番号(int)
行の先頭を表すint`の値
は両方ともストアドプロシージャのグローバル入力パラメータです。ストアドプロシージャ内のSQLクエリをT-SQLでコンパイルし、ストアドプロシージャの最後に Exec(@sqlstatement)
を使って結果を表示していますが、実行される @sqlstatement
変数の中で @RowFrom
または @RowTo
を使用しようとするとこのエラーが表示されます。
"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;
参考までに、古い投稿ですが、データベースのCOLLATIONの設定によっては、以下のようなステートメントでこのエラーが発生することがあります。
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;
将来の私に対する答えです(多分それは他の誰かにも役立ちます。!)。 このようなものをクエリエディタで実行しようとすると、
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'
そして、あなたはエラーを取得します:
スカラー変数「@年」を宣言する必要があります。
これは、 BOTH 格納されたプロシージャの実行 AND を含むコードの束を実行しようとしているためです。!)。 実行したいものを強調するか、興味のないものを削除/コメントしてください。