动态sql和如何转义特殊字符?

时间:2014-02-11 15:51:19

标签: sql sql-server tsql

我有一个存储过程,它根据字符串搜索名称。

如果我传递@SearchTerm作为以下值:o'clock

SET @NameSearch = ' (CONTAINS(lmc.Name,''"*' + REPLACE(@SearchTerm,'''','''''') + '*"'')) '

@NameSearch将设置为:

"*o''clock*"

这不会返回任何行。

但是,如果我只是传递'clock',那么我将获得所有包含'clock'一词的名称的结果。

有人可以向我解释我如何能够正确地逃离'

2 个答案:

答案 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)

没关系,但是因为你要自动加倍撇号,那么你可能只是错误地添加额外的撇号。可能你应该挖掘这个方向或者给我们提供清晰的代码片段。