2011-08-24 20 views
45

スカラー変数を宣言しなければならない

@RowTo int

は、ストアドプロシージャのグローバル入力パラメータです.SQLストアドプロシージャ内のSQLクエリをT-SQLでコンパイルするので、ストアドプロシージャの最後にExec(@sqlstatement)を使用して結果、@RowFromまたは@RowToを実行する@sqlstatement変数内で@RowFromまたは@RowToを使用しようとすると、このエラーが表示されます。それ以外の場合は正常に動作します。

@sqlstatementまた、 @sqlstatement変数に以下を含めるようにしました。

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

@RowTo@Rtに値を渡しません。

+0

私はこの質問に特に当てはまらないので、私は答えを追加しませんが、このエラーのためのgoogleの最初の結果として、 'GO'を使うと宣言された変数が見えないその声明を過ぎて。 – IronSean

答えて

49

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); 

適切なパラメータを持っている方が良いでしょうけれども、例えばただ、FYI

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

EXEC sp_executesql @sql, 
    N'@RowFrom INT, @RowTo INT', 
    @RowFrom, @RowTo; 
+1

ありがとうございますが、N 'はどうしますか? – bill

+3

これは '@ sql'変数が' NVARCHAR'として正しく解釈されることを保証します - もし 'sp_executesql'を使うのなら... –

+1

このように使用されているので、Intでなければなりません " Where RowNum @RowFromと@ RowTo " param @ RowFrom/@ RowToはintであり、Declaredと同様です。 – bill

4

、私はこれは古い記事ですけど、データベースの照合順序の設定に応じて、あなたがこのようなステートメントでこのエラーを取得することができ、

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

たとえば、あなたはSをタイプミスならば

SET @sql = @***S***ql 

ここに既に掲載されている回答を申し訳ありませんが、これは報告されたエラーの実際の例です。

注意もエラーがメッセージで資本Sを表示しないことを、私はなぜわからないが、私は

Set @sql = 

は、等号の左側にあるので、それはあると思います。

+0

非常に重要なコメント(そして私の場合の実際の問題....) – Dani

0

大文字と小文字の区別もこの問題の原因になります。

@MyVariableと@myvariableは、SQL Server Manの同じ変数です。スタジオと動作します。しかし、これらの変数は大文字と小文字の区別のためにVisual Studio(C#)でスカラー変数 "@MyVariable"を宣言する必要があります。

0

this MSDN blog ...

複数の行にまたがる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; 
関連する問題