2016-02-04 59 views
0

這是我在動態SQL中的第一個項目。SQL Server 2012錯誤:必須聲明標量變量@lcrcolumn_total

當我運行下面的查詢。我得到一個錯誤:

Must declare scalar variable "

雖然我宣佈變量@lcrcolumn_total預先。

EXECUTE (' UPDATE facetswrk.dbo.ODS_SUBSC_PREM_REPORT ' + ' SET ' + @lcrcolumn_name + ' = @lcrcolumn_total') 

在此先感謝!

+0

很簡單 - 'EXECUTE'命令將執行它的命令參數中的內容。它有自己的會話,所以當你使用任何變量時,它必須在這個命令中聲明,而不是在外面。 – krtek

回答

3

你需要傳遞變量的動態SQL:

DECLARE @sql NVARCHAR(MAX) = 
    'UPDATE facetswrk.dbo.ODS_SUBSC_PREM_REPORT 
    SET @lcrcolumn_name = @lcrcolumn_total' 
    -- WHERE = ?; -- are you sure you want to update all rows 

SET @sql = REPLACE(@sql, '@lcrcolumn_name', QUOTENAME(@lcrcolumn_name)); 

EXEC dbo.sp_executesql 
    @sql, 
    N'@lcrcolumn_total INT', -- set type of @lcorumn_total 
    @lcrcolumn_total; 

LiveDemo

備註:

  1. 添加WHERE條件,否則你將更新所有行
  2. 使用sp_executesql代替EXEC
  3. 通行證變量@lcrcolumn_total用正確的數據類型
  4. 使用QUOTENAME避免SQL注入,取代列名時
+1

**對於downvoter,請留下評論爲什麼你認爲這個答案不正確/有幫助** – lad2025

+0

。 。你的答案絕對不值得讚賞。這是對的,如果我先讀過它,我就不會困擾回答。 –

+0

同樣的錯誤被拋出爲「必須聲明標量變量」。我也沒有讓你失望。謝謝 –

0

如果你正在學習動態SQL,然後就學會用sp_executesql,因爲它是執行此類聲明的最佳方式。它允許你傳入和傳出參數。這很重要,因爲「exec」語句不與外部上下文共享變量。

的代碼看起來更象這樣:

DECLARE @sql nvarchar(max); 

SET @sql = ' 
UPDATE facetswrk.dbo.ODS_SUBSC_PREM_REPORT 
    SET @lcrcolumn_name = @lcrcolumn_total 
'; 

SET @sql = REPLACE(@sql, '@lcrcolumn_name', @lcrcolumn_name); 

EXEC sp_executesql @sql, N'@lcrcolumn_total int', @lcrcolumn_total = @lcrcolumn_total; 

請注意,您無法通過列名和表名作爲參數,所以這些使用REPLACE()處理。

+0

我用你的查詢,並得到一個錯誤。過程期望類型爲'ntext/nchar/nvarchar'的參數@params' –

+0

而且您需要聲明並初始化'@ lcrcolumn_total' –