我有一个存储过程,它根据字符串搜索名称。
如果我传递@SearchTerm
作为以下值:o'clock
SET @NameSearch = ' (CONTAINS(lmc.Name,''"*' + REPLACE(@SearchTerm,'''','''''') + '*"'')) '
@NameSearch
将设置为:
"*o''clock*"
这不会返回任何行。
但是,如果我只是传递'clock'
,那么我将获得所有包含'clock'
一词的名称的结果。
有人可以向我解释我如何能够正确地逃离'
。
答案 0 :(得分:3)
您应该使用参数化查询。这是一个例子:
DECLARE @sql nvarchar(max), @paramlist nvarchar(max)
SELECT @sql= 'SELECT Test_Name
FROM [Test]
WHERE (1 = 1)'
SELECT @sql = @sql + ' AND (Test_Name LIKE (@Name + ''Toto''))'
SELECT @paramlist = '@Name nvarchar (256)'
EXEC sp_executesql @sql, @paramlist, @SearchTerm
答案 1 :(得分:0)
1。你写的 如果@NameSearch设置为:“* o''clock *”,但我想你的意思是@SearchTerm
<强> 2 强>
的结果是什么?SELECT * FROM sys.dm_fts_parser ('"*o''clock*" ', 1033, 0, 0)
一排,两排还是三排?可能是你有关wordbreakers的问题。首先设置你的语言,可能不是英语(1033)。
第3 强> 如果我需要动态运行它,那么我会再次加倍撇号:
DECLARE @sql nvarchar(max)= 'SELECT * FROM sys.dm_fts_parser (''"*o''''clock*" '', 1033, 0, 0)'
exec(@sql)
没关系,但是因为你要自动加倍撇号,那么你可能只是错误地添加额外的撇号。可能你应该挖掘这个方向或者给我们提供清晰的代码片段。