为什么MS SQL Server使用“LIKE”查询返回结果,但使用“=”返回空集

为什么MS SQL Server使用“LIKE”查询返回结果,但使用“=”返回空集,sql,sql-server,Sql,Sql Server,我正在使用MS SQL Server 2017。在本例中,我有一个表[myTable],其中一个实体全名为varchar255 在这个表中,我有一个使用以下参数导入的批量记录 (FIELDTERMINATOR = '~', ROWTERMINATOR = '0x0A' ) 以下查询返回单个记录: SELECT [full name] FROM myTable WHERE [full name] LIKE '%LastName%' 但是,以下查询不适用: SELECT [full name]

我正在使用MS SQL Server 2017。在本例中,我有一个表[myTable],其中一个实体全名为varchar255

在这个表中,我有一个使用以下参数导入的批量记录

(FIELDTERMINATOR = '~',
 ROWTERMINATOR = '0x0A' )
以下查询返回单个记录:

SELECT [full name]
FROM myTable
WHERE [full name] LIKE '%LastName%'
但是,以下查询不适用:

SELECT [full name]
FROM myTable
WHERE [full name] = 'Firstname Lastname'
我已经验证了记录的存在,我已经复制了实体的值,以确保数据中没有有趣的事情发生。结果很清楚,我甚至试过这个:

SELECT [full name]
FROM myTable
WHERE [full name] = 'Firstname Lastname ' 
以确保列末尾没有随机空格。什么会导致这样的问题?

操作符只有在得到精确匹配时才工作

但LIKE运算符用于在数据中搜索指定的模式

因此,在您的例子中,比较值与列值不直接匹配,这就是为什么它不返回任何行,但在类似匹配模式的情况下,它返回行

正如名称本身所示,主要用于比较某种形式的数据,这种形式主要是正则表达式

鉴于

=只找到精确的匹配项,而不是它应该是某种形式,而是=左侧的数据应该是它右侧的内容的清晰副本

例如

根据您的上述输入样本 …其中全名类似于%FirstName%。这通常意味着,选择fullname包含firstname的数据

如果我替换这个% …全名和名字一样 那就跟
…其中fullname=FirstName,因为在这里它希望精确匹配,而不是某种形式的数据

我有一个方便的脚本,用于识别不可见的字符;它为您提供字符串中的每个字符,但每个字符作为单独的行

DECLARE @nstring NVARCHAR(1000)

select top 1 @nstring = [full name]
FROM myTable
WHERE [full name] LIKE '%LastName%'

print @nstring

DECLARE @position INT
 SET @position = 1

DECLARE @CharList TABLE (
 Position INT,
 UnicodeChar NVARCHAR(1),
 UnicodeValue INT
 )

WHILE @position <= DATALENGTH(@nstring)
 BEGIN
 INSERT @CharList
 SELECT @position as Position
 ,CONVERT(nchar(1),SUBSTRING(@nstring, @position, 1)) as UnicodeChar
 ,UNICODE(SUBSTRING(@nstring, @position, 1)) as UnicodeValue
 SET @position = @position + 1
 END

SELECT * FROM @CharList
有一个提示说明您可以使用SSIS。本文还解释了ROWTERMINATOR出现的这个问题。话虽如此,我将创建一个SSIS项目,其中包含一个从数据源插入批量数据的包。如果这是一个重复的过程,可以在SSMS中安排或快速测试


如果您是SSIS新手或不熟悉SSIS,请参阅此处:

此处没有足够的信息可以回答。=只适用于精确匹配的情况。你显然没有一个精确的匹配。这是我在没有可验证信息的情况下所能做到的最具体的事情。嗨,德文,谢谢你的快速回复。我知道我没有精确的匹配。在这张表中,我只处理人的全名。所以如果你是Devin Burke,你的名字会在数据库中显示为Devin Burke。只是名字和姓氏之间的一个空格。基于此,如果我要使用Select[full name]从myTable中查询我的表,其中[full name]如“%Burke%”,我将得到预期的结果,但是,以下预期相同结果的查询将返回一个空集。从myTable中选择[full name],其中[full name]=“Devin Burke”从myTable中选择[full name]的结果是什么,其中[full name]类似于“%LastName%”?很明显,这不仅仅是Firstname和LastName之间的空格,还有其他字符。从myTable中选择[full name],其中[full name]像%LastName%一样,包含此查询的o/p的一些示例结果,以便在缺少任何空间等的情况下进行调试。是否可以解释为什么无法获得精确匹配?我已经验证了记录的内容只包含文本,没有其他内容。Michael Rodriguez是名称在数据库中的精确显示方式,但如果我使用以下命令进行查询:从myTable中选择[full name],其中[full name]='Michael Rodriguez'返回了一个空集。@MRod93可能是空间相关的问题,尽管我怀疑存在this@MRod93如果可能的话,将您的表放入板条箱中,并在fiddle中插入数据并与我们共享,只是为了检查是否存在空间问题:从myTable中选择[full name]的结果是什么,其中[full name]类似于“%Michael%Rodriguez%”?谢谢!当我再次遇到这个问题时,我一定会对此进行解释,因为我已经运行了查询,结果显示一个unicode值为“13”的空字符,后面还有5行带有“NULL”值,这意味着有问题的姓氏后面有隐藏字符。这基本上回答了我的问题,谢谢你,克里斯!然后字符串中有一些东西,可能是不可见的,导致精确比较返回一个空集。通过使用LIKE运行select查询来检查数据,并在查询中发布很少的结果