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 Collation 是 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) 使用默认上下文数据库自动整理:
如果数据库部分包含…
我正在努力使用下面的查询提取数据。
该列中的所有字符串值都会出现此问题。即使我从这个 table 复制 SSMS 中的实际值并将其粘贴到 select 语句 (where string = 'MyStringVlaue'
) 中。 LTRIM/RTRIM 功能也没有帮助。
一些信息:
数据库table源列数据类型为VARCHAR(500)
。
我的数据库兼容级别是 130。使用 SSMS 2016。 我的数据库排序规则是 SQL_Latin1_General_CP1_CI_AS 我的字符串 Column Collation 是 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) 使用默认上下文数据库自动整理:
如果数据库部分包含…