存储过程中的exec不起作用

时间:2014-01-31 09:56:37

标签: sql-server-2008

这是在存储过程中并且不起作用(我的意思是在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')

我不确定这里发生了什么,因为我需要exec才能工作。

1 个答案:

答案 0 :(得分:1)

让我们假装您的会话ID为1234。在这种情况下,您的过滤器将如下所示:

SessionID='1234'

因此,您的sql变量将如下所示:

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

这将是语法错误 - 您过早关闭@Filter字符串。

修改

另外,请阅读SQL注入。如果您的会话ID或UserId变量在用户的控制之下,那么您将对SQL注入攻击敞开大门。