我的查询是:
declare @param1 INT,
@param2 nvarchar(max)
set @param1 = 1
set @param2 = '[Test_data_forQry],[Next_Test_Data]'
SELECT *
FROM Table1
WHERE
ColumnA = @param1
AND (',' + @param2 +',' LIKE '%,' + CONVERT(VARCHAR, ColumnB) + ',%');
方括号和下划线阻止了数据提取。我的问题是我应该在最后一行查询中放置 escape'\'。
我还尝试了 REPLACE
选项,但没有效果
set @param1 = 1
set @param2 = '[Test_data_forQry],[Next_Test_Data]'
set @param2 = replace (replace(@param2 , '[', '[[]'), '_','[_]')
SELECT *
FROM Table1
WHERE
ColumnA = @param1
AND (',' + @param2 +',' LIKE '%,' + CONVERT(VARCHAR, ColumnB) + ',%');
答案 0 :(得分:0)
您需要先转义所有LIKE字符并使用ESCAPE运算符。此外,您将ColumnB转换为VARCHAR默认情况下仅为VARCHAR(30),因此ColumnB中的数据被截断且不匹配,因为@ param2本身是未转义的35个字符。
见下文:
DECLARE @param1 INT, @param2 NVARCHAR(MAX);
SET @param1 = 1
SET @param2 = '[Test_data_forQry],[Next_Test_Data]'
-- Replace LIKE special characters
SET @param2 = REPLACE(REPLACE(REPLACE(REPLACE(@param2, '[', '|['), ']', '|]'), '%', '|%'), '_', '|_')
SELECT *
FROM Table1
WHERE
ColumnA = @param1
AND CONVERT(NVARCHAR(MAX), ColumnB) LIKE ('%,' + @param2 +',%') ESCAPE '|';
修改:如果您的ColumnB数据确实包含' [Test_data_forQry]'你在其中一条评论中指出的,然后让它像这样转换并转义ColumnB而不是@param2:
DECLARE @param1 INT, @param2 NVARCHAR(MAX);
SET @param1 = 1
SET @param2 = '[Test_data_forQry],[Next_Test_Data]'
SELECT *
FROM Table1
WHERE
ColumnA = @param1
AND @param2 LIKE '%' + REPLACE(REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(MAX), ColumnB), '[', '|['), ']', '|]'), '%', '|%'), '_', '|_') + '%' ESCAPE '|';
在地方发生这么多事情的情况下效果不佳,但这会匹配ColumnA = 1和ColumnB =' [Test_data_forQry]'
的行。<强>更新强> 更新为在逗号上拆分搜索字符串(可能需要先从here创建一个函数):
DECLARE @param1 INT, @param2 NVARCHAR(MAX);
SET @param1 = 1
SET @param2 = '[Test_data_forQry],[Next_Test_Data]'
-- Replace LIKE special characters
SET @param2 = REPLACE(REPLACE(REPLACE(REPLACE(@param2, '[', '|['), ']', '|]'), '%', '|%'), '_', '|_')
SELECT DISTINCT t.*
FROM Table1 t
INNER JOIN dbo.split(@param2, ',') split ON 1=1
WHERE
t.ColumnA = @param1
AND CONVERT(NVARCHAR(MAX), t.ColumnB) LIKE ('%' + split.s + '%') ESCAPE '|';
答案 1 :(得分:0)
我能够通过使左方括号成为文字来实现。试试这个:
declare @table table (column1 varchar(100))
insert @table(column1) values('[square_brackets_1]')
insert @table(column1) values('[square_brackets_2]')
insert @table(column1) values('[square_brackets_3]')
insert @table(column1) values('[square_brackets_4]')
insert @table(column1) values('[square_brackets_5]')
select * from @table
select * from @table where column1 like '[[]square_brackets_5]'
答案 2 :(得分:0)
我建议你像这样使用"
:
set @param2 = '"' + REPLACE(@param2, ',' , '","') + '"'
注意:
SET QUOTED_IDENTIFIER = ON
=&gt;默认
当SET QUOTED_IDENTIFIER
为ON
时,标识符可以用双引号分隔,文字必须用单引号分隔。如果SET QUOTED_IDENTIFIER
为OFF
,则无法引用标识符,并且必须遵循标识符的所有Transact-SQL规则。