在LIKE条件中使用从表变量中选择



我有一个服务器日志文件,我正试图精简该文件以便于检查。我正在搜索的表只是在一个名为Spam.LogData的单列表中进行大容量插入。这样做的一个重要部分是删除合法用户的活动。我已经有了一个语句,可以通过解析日志中的特定行来提取需要删除的会话ID。这是唯一一个始终将会话ID和电子邮件地址放在同一位置的行。然后,我可以将会话ID读取到一个非常简单的表变量中。

declare @sessionid table (sesID int)

问题是使用这个表中的数据创建一个类似的语句来查找&拆下必要的管路。我想这句话可以让我选择出与这些会话ID相关的行,并通过将注释从delete翻转到select,来删除它们。

--delete
select *
from Spam.LogData
where data like '%' + (select 'session ' + cast(sesID as nvarchar) from @sessionid) + '%'

然而,我得到了错误:

子查询返回了多个值。当子查询跟随=,!=<lt;=>gt;=或者当子查询用作表达。

最好的方法是什么?

也许您可以使用JOIN而不是子查询:

--delete LD
select LD.*
from Spam.LogData as LD
inner join @sessionid as S on LD.data like '%session ' + cast(S.sesID as nvarchar) + '%'

尝试使用CTE。

我不确定您是如何获得要筛选的会话ID的列表的,所以这是相当一般的。

declare @yourVar varchar(64) = '12345678';
with CTE as (select sessionID from SessionTable
where sessionID like '%'+ @yourVar + '%')
select * from Spam.LogData
--delete Spam.LogData
where [data] in (select sessionID from CTE)

更新:Ryan,如果我理解你的评论,你的数据看起来与此类似。

declare @table table(val int,  tID int identity)
insert into @table values( 1)
insert into @table values( 2)
insert into @table values( 5)

您需要在日志表中查找包含int值作为字符串一部分的记录。例如:session1、session2、session5,但不是session3或session4

create table logData (sessionID varchar(50), misc varchar(24), id int identity )
insert into logData (sessionID, misc) values('session1', 'aaa')
insert into logData (sessionID, misc) values('session1','bbb')
insert into logData (sessionID, misc) values('session2', 'ccc')
insert into logData (sessionID, misc) values('session3', 'aaa')
insert into logData (sessionID, misc) values('session4','bbb')
insert into logData (sessionID, misc) values('session4', 'ccc')
insert into logData (sessionID, misc) values('session5', 'aaa')
insert into logData (sessionID, misc) values('session5','bbb')

虽然不优雅,但它会完成任务。如果这没有帮助,你可以试试看光标。

请确保您声明的会话值为integers的@表有一个Identity列。

declare @pos int = 1, @last int, @val varchar(50)
select @last = max(tID) from @table
while ( @pos <= @last)
begin
select @val = cast(val as varchar) from @table where tID = @pos
select * from logData where sessionID  like 'session%' + @val 
set @pos = @pos+ 1
end
-- drop table logData

最新更新