Sql 如果位于表达式左侧,则创建为包含'%'的文本字符串;如果'%'位于右侧,它将仅将其视为通配符。例如,'a%'像'abc'一样返回false,但是'abc'像'a%'会返回true。我已经设置了fiddle,它没有给我任何数据,所以可能我不明白,因为他看起来

Sql 如果位于表达式左侧,则创建为包含'%'的文本字符串;如果'%'位于右侧,它将仅将其视为通配符。例如,'a%'像'abc'一样返回false,但是'abc'像'a%'会返回true。我已经设置了fiddle,它没有给我任何数据,所以可能我不明白,因为他看起来,sql,sql-server,Sql,Sql Server,如果位于表达式左侧,则创建为包含'%'的文本字符串;如果'%'位于右侧,它将仅将其视为通配符。例如,'a%'像'abc'一样返回false,但是'abc'像'a%'会返回true。我已经设置了fiddle,它没有给我任何数据,所以可能我不明白,因为他看起来需要匹配表2中的确切关键字。带通配符的值需要在表达式的右侧TABLE2。关键字+'%'将被视为包含'%'的文本字符串(如果它位于表达式的左侧);如果'%'位于右侧,它将仅将其视为通配符。例如,'a%'像'abc'一样返回false,但是'abc


如果位于表达式左侧,则创建为包含
'%'
的文本字符串;如果
'%'
位于右侧,它将仅将其视为通配符。例如,
'a%'像'abc'
一样返回false,但是
'abc'像'a%'
会返回true。我已经设置了fiddle,它没有给我任何数据,所以可能我不明白,因为他看起来需要匹配表2中的确切关键字。带通配符的值需要在表达式的右侧
TABLE2。关键字+'%'
将被视为包含
'%'
的文本字符串(如果它位于表达式的左侧);如果
'%'
位于右侧,它将仅将其视为通配符。例如,
'a%'像'abc'
一样返回false,但是
'abc'像'a%'
会返回true。我已经设置了fiddle,它没有给我任何数据这是一个糟糕的主意。如果有人可以
插入
更新
表2中的值,则可以进行注射。例如,一个值是
“”;下表2;——'
返回
表1中的所有值,然后(立即)删除
表2
@Larnu Good point。这仅对较小的数据长度是完全安全的(这甚至不起作用它在
处有语法错误,因为x
它不起作用它有更多的错误,列名“关键字”无效。@学习谢谢。我已经更新了它以包含示例数据。这是一个糟糕的主意。如果有人可以
插入
更新
表2中的值,它是完全可以注入的。例如,一个值将是
”;DROP TABLE Table2;-”
,它将返回
TABLE1
中的所有值,然后(立即)DROP
Table2
@Larnu Good point。这仅对较小的数据长度是完全安全的(这甚至不起作用它在
处有语法错误,因为x
它不起作用它有更多错误,列名“关键字”无效。@学习谢谢。我已更新它以包含示例数据。添加你加入:),我已修改我的代码例如添加你加入:),例如,我已修改我的代码
SELECT * FROM TestTable WHERE keyword IN ( Select Tags from Tags)
 SELECT * FROM TestTable WHERE keyword LIKE ( Select Tags from Tags)
SELECT * FROM TABLE1 T1
WHERE EXISTS
(
 SELECT 1 FROM TABLE2 T2 WHERE T1.Keyword LIKE '%' + T2.keyword + '%'
)
SELECT * FROM TABLE1 T1
INNER JOIN TABLE2 T2 ON T1.Keyword LIKE '%' + T2.keyword + '%'
SELECT * FROM TABLE1 T1
INNER JOIN TABLE2 T2 ON T1.Keyword = T2.keyword 
SELECT *
FROM TABLE1
INNER JOIN TABLE2 ON TABLE2.keyword = TABLE1.keyword
SELECT *
FROM TABLE1
INNER JOIN TABLE2 ON TABLE2.keyword+'%' LIKE TABLE1.keyword
Declare @keywords as nvarchar(max)
Declare @Sql as nvarchar(max)

select @keywords = 
    stuff((
        select distinct ' or [Tags] like ''%' + [tags] + '%'''
        from [tags]
        for xml path('')
    ),1,3,'')

set @Sql = 'SELECT * FROM [TestTable] WHERE ' + @keywords 

exec(@Sql)
create table a (keyword varchar(20))
create table b (keyword varchar(20))

insert into a values ('the'), ( 'quick'), ( 'brown'), ( 'fox'), ( 'jumped'), ( 'over'), ( 'the'), ( 'lazy'), ( 'dog')
insert into b values ('the'), ( 'quic'), ( 'browns'), ( 'x'), ( 'jumped'), ('quick,brown,fox')

Declare @keywords as nvarchar(max)
Declare @Sql as nvarchar(max)

select @keywords = 
    stuff((
        select distinct ' or keyword like ''%' + [keyword] + '%'''
      --select distinct ' or keyword = ''' + [keyword] + '''' --if exact match is required
        from b
        for xml path('')
    ),1,3,'')

set @Sql = 'SELECT * FROM a WHERE ' + @keywords 

exec(@Sql)
CREATE  FUNCTION [dbo].[fn_split](
@str VARCHAR(MAX),
@delimiter CHAR(1)
)
RETURNS @returnTable TABLE (idx INT PRIMARY KEY IDENTITY, item VARCHAR(8000))
AS
BEGIN
DECLARE @pos INT
SELECT @str = @str + @delimiter
WHILE LEN(@str) > 0 
    BEGIN
        SELECT @pos = CHARINDEX(@delimiter,@str)
        IF @pos = 1
            INSERT @returnTable (item)
                VALUES (NULL)
        ELSE
            INSERT @returnTable (item)
                VALUES (rtrim(ltrim(SUBSTRING(@str, 1, @pos-1))))
        SELECT @str = SUBSTRING(@str, @pos+1, LEN(@str)-@pos)       
    END
RETURN
END
select * from tmp20180308 t1 CROSS APPLY fn_split(t1.keyword, ',') t2
inner join table2 t3 on t3.keyword=t2.item