在 LIKE 条件中使用来自 table 变量的 select

Using select from a table variable in a LIKE condition

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

declare @sessionid table (sesID int)

问题是使用此 table 中的数据创建类似语句以查找并删除必要的行。我认为这条语句将允许我 select 删除与这些会话 ID 关联的行,并通过将注释从删除翻转到 select,删除它们。

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

但是我收到错误:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

最好的方法是什么?

也许您可以使用 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)

您需要在日志 table 中查找将 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')

不够优雅,但可以完成工作。如果这没有帮助,您可以尝试查看游标。

确保您使用会话值整数声明的@table 具有标识列。

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