2011-08-24 80 views
45

@RowFrom int必須聲明標量變量

@RowTo int

都是全局輸入PARAMS的存儲過程,因爲我在編譯存儲過程中的SQL查詢和T-SQL然後在最後使用Exec(@sqlstatement)的存儲過程來顯示結果,它給了我這個錯誤,當我嘗試使用@sqlstatement變量中的@RowFrom@RowTo執行..它工作正常,否則..請幫助。

"Must declare the scalar variable "@RowFrom"." 

此外,我試圖包括在@sqlstatement變量以下:

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

@RowTo仍然其值不傳遞給@Rt並生成錯誤。

+0

我不會添加一個答案,因爲它不具體適用於這個問題,但作爲谷歌這個錯誤的第一個結果,值得注意的是,使用'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,對嗎?

在你的情況,你並不真的需要重新申報@Rt等@sql串裏面,你只需要說:

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; 
+1

謝謝,但N是做什麼的? – bill

+3

它確保你的'@ sql'變量被正確解釋爲'NVARCHAR' - 如果使用'sp_executesql'則需要... –

+1

那麼它們需要是Int,因爲它的使用像這樣 「Where RowNum Between @RowFrom和@ RowTo「 參數@ RowFrom/@ RowTo是int,以及聲明.. – 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;