我怎么能忽略';SQL Server where子句中的字符?

我怎么能忽略';SQL Server where子句中的字符?,sql,sql-server,where-clause,Sql,Sql Server,Where Clause,我对SQL Server的查询有以下问题 我有一个简单的疑问: SELECT * FROM [PROT_UTENTI] WHERE Nome = 'Paolo D''Aannuntis' 通过Nome字段查找用户(表示名称和姓氏,我知道,这很可怕,但我无法更改数据库,因为它是生产中的旧遗留应用程序) 如您所见,姓氏(D'Annuntis)包含“字符(我通过将“”加倍来转义它) 问题是,我正在使用Nome值执行此查询,该值是从另一个数据库(它涉及到迁移过程)中提取的,在该数据库中,相同

我对SQL Server的查询有以下问题

我有一个简单的疑问:

SELECT *
FROM [PROT_UTENTI]
WHERE 
    Nome = 'Paolo D''Aannuntis'
通过Nome字段查找用户(表示名称和姓氏,我知道,这很可怕,但我无法更改数据库,因为它是生产中的旧遗留应用程序)

如您所见,姓氏(D'Annuntis)包含字符(我通过将“”加倍来转义它)

问题是,我正在使用Nome值执行此查询,该值是从另一个数据库(它涉及到迁移过程)中提取的,在该数据库中,相同的Nome字段被保存,而姓氏中没有'字符

因此,我正在执行此查询:

SELECT *
FROM [PROT_UTENTI]
WHERE 
    Nome = 'Paolo DAannuntis'
反而

SELECT *
FROM [PROT_UTENTI]
WHERE 
    Nome = 'Paolo D''Aannuntis'
正在查找0结果


我的问题是:有一种方法可以忽略,这样where子句Nome='Paolo DAannuntis'可以找到相同的结果Nome='Paolo D''Aannuntis'

您可以在搜索查询中不使用任何内容替换任何内容

SELECT *
FROM   [PROT_UTENTI]
WHERE  replace(Nome, '''', '') = 'Paolo DAannuntis'
您也可以在两侧进行更换

WHERE  replace(Nome, '''', '') = replace('Paolo D''Aannuntis', '''', '')
您写道,该值是在迁移过程中从另一个数据库中提取的,
所以我想你会有一个变量

declare @nome varchar(100) = 'Paolo D''Aannuntis' -- filled by your process

SELECT *
FROM   [PROT_UTENTI]
WHERE  replace(Nome, '''', '') = replace(@nome, '''', '')
无论变量或
[PROT_tentu].nome中是否有引号,这都会找到您的行


这将影响查询的性能,因此我希望表中没有数百万行

您可以将搜索查询中的“any”替换为“nothing”

SELECT *
FROM   [PROT_UTENTI]
WHERE  replace(Nome, '''', '') = 'Paolo DAannuntis'
您也可以在两侧进行更换

WHERE  replace(Nome, '''', '') = replace('Paolo D''Aannuntis', '''', '')
您写道,该值是在迁移过程中从另一个数据库中提取的,
所以我想你会有一个变量

declare @nome varchar(100) = 'Paolo D''Aannuntis' -- filled by your process

SELECT *
FROM   [PROT_UTENTI]
WHERE  replace(Nome, '''', '') = replace(@nome, '''', '')
无论变量或
[PROT_tentu].nome中是否有引号,这都会找到您的行



这将影响查询的性能,因此我希望表中不会有数百万行

为什么在迁移过程中以不同的方式保存Nome,这就是修改数据a。我建议需要修复插入/迁移过程,以使源数据和目标数据保持一致。是否使用
替换
?但是你拥有的任何索引对你来说都是无用的。@enehhh在一个理想世界里你是对的。因为用户名在两个数据库中的保存方式不同,我必须使用第一个数据库中保存的值(不包含“字符”)来查询第二个数据库,该数据库包含允许“字符”的名称。但是,它可以与
replace
一起使用,你是在动态搜索值吗?如果你使用参数化查询,那么你将不会有任何关于“字符”的问题。此外,始终使用参数是一种很好的做法,这样您就不会受到SQL注入的攻击。为什么在迁移过程中以不同的方式保存Nome,这就是修改数据a。我建议需要修复插入/迁移过程,以使源数据和目标数据保持一致。是否使用
替换
?但是你拥有的任何索引对你来说都是无用的。@enehhh在一个理想世界里你是对的。因为用户名在两个数据库中的保存方式不同,我必须使用第一个数据库中保存的值(不包含“字符”)来查询第二个数据库,该数据库包含允许“字符”的名称。但是,它可以与
replace
一起使用,你是在动态搜索值吗?如果你使用参数化查询,那么你将不会有任何关于“字符”的问题。此外,始终使用参数是一种很好的做法,这样您就永远不会受到SQL注入的攻击。他的问题是另一方面,他希望使用“Paolo D”“Aannuntis”搜索姓名。
@即使我在编辑我的答案时使用了一个左右搜索的选项,第一个选项也会起作用,然而,OP必须明确的是,该规则适用于每一行,而不仅仅是一行硬编码value@Ven我猜Paolo DAannuntis的值只是一个例子,他的实际查询将使用一个变量,或者来自另一个表格的输入他的问题是相反的,他希望用“Paolo D”“Aannuntis”搜索姓名
@即使我用一个选项编辑了我的答案,可以双向搜索。如果是,第一个选项会起作用,但是OP必须清楚,规则适用于每一行,不只是一个硬编码的value@Ven我猜Paolo DAannuntis的值只是一个例子,他的实际查询将使用一个变量,或者来自另一个表的输入