SQL Server 2008 及更高版本中的 T-SQL:用于转义要进行类似比较的字符串变量的标准函数

Don*_*ald -1 sql t-sql sql-server sql-server-2008

我有一个参数传入用户输入,然后该参数进入查询以进行通配符搜索。

如同:

DECLARE @myVariableContainingUserInput VARCHAR(50) = 'part of string';

DECLARE @myTable TABLE (column1 varchar(200));

INSERT INTO @myTable(column1) 
VALUES ('This is the whole string that contains part of string the user is looking for')

SELECT column1 
FROM @myTable 
WHERE column1 LIKE '%' + @myVariableContainingUserInput + '%'
Run Code Online (Sandbox Code Playgroud)

在这种情况下,他们得到一排。

然而有时数据看起来像这样:

INSERT INTO @myTable(column1) 
VALUES ('This is the whole string that contains [part] of string the user is looking for')
Run Code Online (Sandbox Code Playgroud)

用户有时可能会搜索

SET @myVariableContainingUserInput  = '[part';
Run Code Online (Sandbox Code Playgroud)

他们希望找到一行包含“这是包含用户正在查找的字符串的[部分]的整个字符串”。并不是因为 [ 是一个特殊字符。

我知道我可以通过使用[[]或例如添加 a\并使用ESCAPE '\'(如果我是控制搜索值的人)来逃避它。输入来自 .NET 应用程序,我无法提前知道哪些特殊字符出现在参数中,或者它们在字符串中的位置或可能有多少。

是否有一个标准函数或正确的方法可以在 SQL Server 2008 中将字符转义为类似的比较(或者可以在 SQL 语句到达服务器之前使用的 .NET 函数)?或者我最好的选择是创建一个特殊字符列表并循环并转义它们或使用正则表达式来执行相同的操作?

我只知道,与经过反复测试的版本相比,制作 DIY 版本可能会比没有进行广泛测试的版本出现更多问题。

我尝试循环遍历特殊字符列表并将其替换为 [[] 或例如添加 \ 并使用 ESCAPE ''

但对于以不同数量或顺序出现的不同字符混合,没有什么效果很好。问题中包含sql server 2008,因为它是客户端的最低支持版本。

Mar*_*ith 5

您只是想查找第 1 列包含用户输入的确切文字字符串的行。

在这种情况下你可以做

WHERE CHARINDEX(@myVariableContainingUserInput, column1) > 0
Run Code Online (Sandbox Code Playgroud)

并且不必逃避任何事情。

你也可以这样做

WHERE  column1 LIKE '%' + REPLACE(
                            REPLACE(
                                REPLACE(@myVariableContainingUserInput, '[', '[[]')
                            , '%', '[%]')
                        , '_', '[_]') + '%'
Run Code Online (Sandbox Code Playgroud)

但它CHARINDEX更简单,我更有信心它是正确的。