2016-05-17 30 views
0

我得到的錯誤「指定的參數太多」,但無法找到問題sp_sqlexec - 對很多參數指定

任何幫助,將不勝感激

3個參數在開始的程序

的規定
DECLARE 
@WhereStatment nvarchar(500), 
@ParamList nvarchar(500) = N'@p1 int, @p2 varchar(256), @p3 int' 

SET @WhereStatment = '' 

-- Check for Status Filter 
IF @StatusFilter <> 'All' 
SET @WhereStatment = @WhereStatment + ' EntryStatus = @StatusFilter' 
ELSE 
BEGIN 
SET @StatusFilter = 'Invoiced (Complete)' 
SET @WhereStatment = @WhereStatment + ' EntryStatus <> @StatusFilter' 
END 

-- Check for User Filter 
IF @UserFilter > 0 
SET @WhereStatment = @WhereStatment + ' AND EobID = @UserFilter' 

-- Check for Warehouse Filter 
IF @WarehouseFilter > 0 
SET @WhereStatment = @WhereStatment + ' AND WarehouseNumber = @WarehouseFilter' 

-- Add WhereStatement 
Set @WhereStatment = ' 
SELECT 
tblWCS_SQE_Entries.RowID, SaleNum, tblWCS_Company_UserAccounts.Fullname, Ets 

FROM tblWCS_SQE_Entries 

INNER JOIN tblWCS_Company_UserAccounts 
ON tblWCS_SQE_Entries.EobID = tblWCS_Company_UserAccounts.RowID 

WHERE 
' 
+ @WhereStatment; 

EXEC sp_sqlexec @WhereStatment, @ParamList, 
       @p1 = @UserFilter, 
       @p2 = @StatusFilter, 
       @p3 = @WarehouseFilter 
+1

sp_sqlexec已不再使用https://social.msdn.microsoft.com/Forums/sqlserver/en-US/554d6373-8a22-4b10-8744-df13e5415f84/spexecutesql-vs-spsqlexec?forum=sqlgetstarted使用sp_executesql。這裏有一個關於如何使用它的例子https://msdn.microsoft.com/en-us/library/ms188001.aspx – CiucaS

+1

'sp_sqlexec'已被棄用,應該使用'sp_executesql'。您的參數列表提供'@ p1,@ p2,@ p3',但查詢引用'@StatusFilter,@UserFilter,@ WarehouseFilter' – MatBailie

回答

2

sp_sqlexec存儲過程確實只有一個參數。相反,您可能需要sp_executesql

+0

謝謝,解決了它。這和MatBailie評論的一樣,引用的參數是錯誤的。 – Simeon

1
DECLARE @SQL NVARCHAR(MAX) 

SET @SQL = ' 
SELECT tblWCS_SQE_Entries.RowID, SaleNum, tblWCS_Company_UserAccounts.Fullname, Ets 
FROM dbo.tblWCS_SQE_Entries 
JOIN dbo.tblWCS_Company_UserAccounts ON tblWCS_SQE_Entries.EobID = tblWCS_Company_UserAccounts.RowID 
WHERE ' 
+ CASE WHEN @StatusFilter = 'All' 
    THEN ' EntryStatus <> ''Invoiced (Complete)''' 
    ELSE ' EntryStatus = @StatusFilter' 
    END 
+ CASE WHEN @WarehouseFilter > 0 THEN ' AND WarehouseNumber = @WarehouseFilter' ELSE '' END 
+ CASE WHEN @UserFilter > 0 THEN ' AND EobID = @UserFilter' ELSE '' END 

EXEC sys.sp_executesql @SQL 
        , N'@p1 int, @p2 varchar(256), @p3 int' 
        , @p1 = @UserFilter 
        , @p2 = @StatusFilter 
        , @p3 = @WarehouseFilter 
+0

謝謝,這是一個更清潔。正在尋找一種方法來執行where子句。沒想到只是添加字符串而不是硬編碼。很有幫助。 – Simeon