2015-06-19 50 views
2

我需要在存儲過程下面的樞軸中輸入一個參數。但它表示,「必須聲明標量變量」@pWeek「。」無法解決:'必須聲明標量變量'@Parameter「`'

我試圖以任何方式聲明它,但我無法弄清楚這一點。 當我得到我想要的數字,我想要的方式時,其他一切都很好。我只需要能夠將其放入SSRS並能夠輸入參數。謝謝。

GO 
/****** Object: StoredProcedure [dbo].[QB_ACCOUNT_SUMMARY] Script Date: 6/19/2015 12:42:12 PM ******/ 
SET ANSI_NULLS OFF 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[QB_ACCOUNT_SUMMARY] 

@pWeek int 

as 
SET NOCOUNT ON 

declare @AccountRef_Fullname AS NVARCHAR(MAX) 



select @AccountRef_Fullname = COALESCE(@AccountRef_Fullname + ',', '') + '['+ AccountRef_Fullname + ']' 

from 
(
select distinct Accountref_fullname 
from (select accountref_fullname from journalcreditlinedetail)JournalCreditLine 
union 
(select accountref_fullname from journaldebitlinedetail) 
union 
(select accountref_fullname from txnexpenselinedetail) 
union 
(select accountref_fullname from depositlinedetail) 
union 
(select discountaccountref_fullname from [appliedtotxndetail]) 
) pAccountRef_Full_Name 


declare @Sql NVARCHAR(MAX) 


set @Sql = N' SELECT [REAL WEEK], [LTWS WEEK], [REAL YEAR], [LTWS YEAR], [LTWS PERIODS], ' + @AccountRef_Fullname 

+ 'from 

(SELECT  * from Account_Summary_View 
where Week = @pWeek 
    )Account_Data ' 

+' PIVOT (' 
+ ' sum(amount) for AccountRef_FullName in ('+ @AccountRef_Fullname +')' 
+' ) AS PivotTable ' 


--+')Data ' 
exec (@Sql) 

; 
+0

你創建動態SQL,你沒忘了聲明和使用變量外的字符串(你們一起做的方式AccountRef_Fullname)?另外我沒有看到你的proc定義中有任何參數。 –

+0

我已更新原始代碼以顯示@pWeek參數以及我試圖實施它的其中一種方法。但我總是收到相同的錯誤信息。我試圖讓它參數可以鏈接到用戶通過SSRS查看時輸入的內容。 –

回答

4

更改此:

where Week = @pWeek 

要這樣:

where Week = ''' + CAST(@pWeek AS varchar(31)) + ''' 

說明:您正在使用動態SQL;將包含SQL命令的字符串放在一起,然後執行它。該動態字符串無法訪問在其自身之外聲明的參數和變量。所以它不能識別@pWeek參數。你沒有在動態sql字符串中聲明它。

當您按照我給您展示的方式進行操作時,您將@pWeek的值連接到字符串中,例如,如果您將值1傳遞給@pWeek,那麼被執行的字符串將包含where Week = '1',這對SQL沒有什麼困難的理解。

你已經在做的正是這一點與這條線在你的現有代碼:

AccountRef_FullName in ('+ @AccountRef_Fullname +')' 
+0

哦,你是一個美麗的人!我可以麻煩你解釋如何和爲什麼這個工作,所以我有一個更好的理解? –

+0

爲我的回答添加了更多解釋。 –