我正在使用MS SQL Server2017。在此示例中,我有一个带有实体full name (varchar(255)
的表[myTable]。
在此表的内部,我导入了一条记录,其中包含以下参数
(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 '
确保列末尾没有随机空格。是什么会引起这样的问题?
答案 0 :(得分:0)
=
运算符仅在完全匹配时有效
但是{中使用LIKE
运算符来搜索数据中的指定模式。
因此,在您的情况下,您的比较值不直接与列值匹配,这就是为什么它不返回任何行,而是在类似模式的情况下因此返回行的原因
答案 1 :(得分:0)
LIKE
主要用于比较某种形式的数据,这些形式主要是regular expressions
而
=
仅找到完全匹配的内容,而不是它应该是某种形式,而是=
左侧的数据应该是其右侧内容的清晰副本。
例如。
根据您上面的输入示例
..where fullname LIKE %FirstName%
。一般而言,这意味着选择其中有全名的数据
如果我替换此%
...where fullname LIKE FirstName
那么它将与
...where fullname = FirstName
因为这里想要的是完全匹配而不是某种形式的数据
答案 2 :(得分:0)
我有一个方便的脚本,用于识别不可见的字符;它会为您提供字符串中的每个字符,但每个字符单独排成一行。
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
答案 3 :(得分:0)
mssqltips上有一条提示,提示您可以使用SSIS。本文还解释了ROWTERMINATOR出现的这个问题。话虽如此,我将创建一个SSIS项目,其中包含一个软件包,该软件包可以从数据源中插入批量数据。如果这是重复的过程,则可以在SSMS中安排或快速测试。
如果您是SSIS的新手或不熟悉SSIS,请在这里引用:SQL Server Integration Services