select 传递相同字符串值的语句无法识别字符串值

String Value is not recognized by select statement passing identical string value

我正在努力使用下面的查询提取数据。

该列中的所有字符串值都会出现此问题。即使我从这个 table 复制 SSMS 中的实际值并将其粘贴到 select 语句 (where string = 'MyStringVlaue') 中。 LTRIM/RTRIM 功能也没有帮助。

一些信息:

数据库table源列数据类型为VARCHAR(500)

我的数据库兼容级别是 130。使用 SSMS 2016。 我的数据库排序规则是 SQL_Latin1_General_CP1_CI_AS 我的字符串 Column Collat​​ion 是 SQL_Latin1_General_CP1_CI_AS

但是当查询从有问题的源 table 原始复制到其他 table 的相同字符串值时,它不会产生任何问题。

有问题的 table 是使用 SQL 服务器导入向导从向导识别为 2007-2010 类型的 Excel 文件导入的。

drop table #T
select 'MyStringVlaue' as String into #t
select * from #t where String ='MyStringVlaue' -- this does not return anything when executed on the Real table!
select * from #t 

-- 例子

select ASCII('MEDICAL SERVICES DISTRICT') -- output is 65

-- P.S.

我创建了一份有问题的副本 table 运行 select * into from originalSourceTable 仍然有同样的问题。

暂定解决方案: 这可能是 SSMS 本身的错误。一旦我打开一个新的查询编辑器 window 并手动输入相同的 select 语句,问题就消失了。请注意,我从旧的 SSMS 查询编辑器 window 复制并粘贴了代码,但问题仍然存在。只有当我从头开始手动输入代码时,它才会有所帮助。

您的数据库值中可能有 "invisible" 个字符,通常的罪魁祸首是尾随换行符,但也可能是任何字符,例如制表符、垂直制表符、退格符等。

像这样输出不匹配值的十六进制值:

SELECT
    CAST(myStringColumn AS VARBINARY(4)),
    CAST('MEDICAL SERVICES DISTRICT' AS VARBINARY(4))
FROM mytable
WHERE myStringColumn like '%MEDICAL SERVICES DISTRICT%'
AND myStringColumn <> 'MEDICAL SERVICES DISTRICT' 

通过检查你可能会发现问题。

如果您有 unicode 字符串,请使用 VARBINARY(8) 而不是 VARBINARY(4)

首先一个字符串值没有排序规则。演示:

DECLARE @STRING VARCHAR(32) COLLATE French_CI_AI;

会失败。

其次,当您创建一个临时文件时table (#) 排序规则是tempdb 排序规则。并且此排序规则可以不同于上下文数据库排序规则。

第三,存在多种解决方案:

1) 使用默认的上下文数据库进行整理:

select 'MyStringVlaue' COLLATE database_default as String into #t

2) 整理一个特定的:

select 'MyStringVlaue' COLLATE SQL_Latin1_General_CP1_CI_AS as String into #t

3) 使用默认上下文数据库自动整理:

如果数据库部分包含…