2014-01-31 48 views
0

這是在存儲過程中並不起作用(我指的exec部分):在存儲過程的執行不會工作

ALTER PROCEDURE [sp_SalerTickets_AddByTemp] 
    @Filter varchar(8000), 
    @UserID int 
AS 
    if (len(@Filter) = 0) 
    return 

    declare @ID varchar(10) 
    set @ID = convert(varchar(10), @UserID) 

    exec('insert into T_ActionTicketSale(ActionTicketID, UserID) 

    select ID, ' + @ID + ' 
    from V_ActionTickets 
    where ID in (select TicketID 
       from T_TmpProcessTicketAction 
       where ' + @Filter + ')') 

@Filter來自C#代碼,看起來像這樣:

string filter = string.Format("SessionID='{0}'", sessionId); 
string sql = String.Format("exec sp_SalerTickets_AddByTemp @Filter='{0}', @UserID={1}", filter, salerID); 

但這個工程:

insert into T_ActionTicketSale(ActionTicketID, UserID) 

select ID, 2950 
from V_ActionTickets 
where ID in (select TicketID from T_TmpProcessTicketAction where SessionID = 'test') 

我不知道這是怎麼回事在這裏,因爲我需要高管來工作。

+0

備註:您應該**不要**爲存儲過程使用'sp_'前綴。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你將來有可能冒着名字衝突的風險。 [這對你的存儲過程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是簡單地避免使用'sp_'並將其他內容用作前綴 - 或者根本沒有前綴! –

+0

謝謝你的建議,但這是功能問題。 – tesicg

回答

1

讓我們假裝你的會話ID是1234。在這種情況下,您的過濾器將類似於:

SessionID='1234' 

因此,您sql變量將是這樣的:

exec sp_SalerTickets_AddByTemp @Filter='SessionID='1234'', @UserID='SomeUserId' 
            ^  ^ ^^ 

這將是一個語法錯誤 - 你是太早關閉您的@Filter字符串。

編輯

另外,請在SQL注入閱讀起來。如果您的會話ID或UserId變量處於用戶的控制之下,那麼您將自己對SQL注入攻擊進行全面開放。

+0

可能出現的語法錯誤是什麼意思?我應該修復什麼? – tesicg