Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在不区分大小写的字段上执行精确的字符串匹配?_Sql Server - Fatal编程技术网

Sql server 如何在不区分大小写的字段上执行精确的字符串匹配?

Sql server 如何在不区分大小写的字段上执行精确的字符串匹配?,sql-server,Sql Server,我希望找到表中的所有行,并匹配一个完全区分大小写的字符串。不幸的是,我的表具有不区分大小写的排序规则 最有效的方法是什么 例如 我希望以下内容不返回任何行: select * from sysobject where name = 'Sysbinobjs' 对于答案,假设@match在一个变量中: declare @match varchar(4000) set @match = 'sysbinobjs' 编辑 澄清,确保正确处理尾随空格,我需要一个考虑尾随空格的精确匹配,这样“Hell

我希望找到表中的所有行,并匹配一个完全区分大小写的字符串。不幸的是,我的表具有不区分大小写的排序规则

最有效的方法是什么

例如

我希望以下内容不返回任何行:

select * from sysobject where name = 'Sysbinobjs' 
对于答案,假设@match在一个变量中:

declare @match varchar(4000) 
set @match = 'sysbinobjs'
编辑


澄清,确保正确处理尾随空格,我需要一个考虑尾随空格的精确匹配,这样“Hello”将只与“Hello”匹配,而不是与“Hello”匹配。

这是一段有效的代码片段,以安全有效的方式进行匹配非常困难。双重匹配是为了避免表扫描(查看执行计划)。varbinary强制进行长度和大小写匹配。所以尾随空间处理得很好,外壳处理得很好

注意被比较的类型需要与表中的类型相同,以便varbinary casting工作(例如,sysobject中的name是一个nvarchar,因此@match需要是一个nvarchar)


实际上,我不明白为什么必须首先进行转义,这是通过COLLATE statment内置到SQL server中的

select * from sysobjects
WHERE name = @match and --Get all relevant hits from the index before doing the final case sensitive test
name COLLATE Latin1_General_CS_AS = @match COLLATE Latin1_General_CS_AS

我简化了我的答案,这一个的问题是尾随空格没有得到正确处理,例如“hello”=“hello”,而且我认为在编码时很难记住collate的内容。+1你是个天才,我的朋友,这个解决方案对我很有效!!
select * from sysobjects
WHERE name = @match and --Get all relevant hits from the index before doing the final case sensitive test
name COLLATE Latin1_General_CS_AS = @match COLLATE Latin1_General_CS_AS