这是在存储过程中并且不起作用(我的意思是在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才能工作。
答案 0 :(得分:1)
让我们假装您的会话ID为1234
。在这种情况下,您的过滤器将如下所示:
SessionID='1234'
因此,您的sql
变量将如下所示:
exec sp_SalerTickets_AddByTemp @Filter='SessionID='1234'', @UserID='SomeUserId'
^ ^ ^^
这将是语法错误 - 您过早关闭@Filter字符串。
修改强>:
另外,请阅读SQL注入。如果您的会话ID或UserId变量在用户的控制之下,那么您将对SQL注入攻击敞开大门。