C# SQL WHERE子句使用尾随空格匹配值
在SQL Server 2008中,我有一个名为C# SQL WHERE子句使用尾随空格匹配值,c#,sql,sql-server,database,sql-server-2008,C#,Sql,Sql Server,Database,Sql Server 2008,在SQL Server 2008中,我有一个名为Zone的表,其中一列ZoneReference varchar(50)not null作为主键 如果我运行以下查询: select '"' + ZoneReference + '"' as QuotedZoneReference from Zone where ZoneReference = 'WF11XU' 我得到以下结果: "WF11XU " 注意后面的空格 这怎么可能?如果那一行上确实有尾随空格,那么我希望返回0结果,因此我假设SQLS
Zone
的表,其中一列ZoneReference varchar(50)not null
作为主键
如果我运行以下查询:
select '"' + ZoneReference + '"' as QuotedZoneReference
from Zone
where ZoneReference = 'WF11XU'
我得到以下结果:
"WF11XU "
注意后面的空格
这怎么可能?如果那一行上确实有尾随空格,那么我希望返回0结果,因此我假设SQLServerManagementStudio正在奇怪地显示其他内容
在C#代码中,调用zoneReference.Trim()
将其删除,表明它是某种空白字符
有人能帮忙吗?这是预期的结果:在SQL Server中,
=
运算符在进行比较时忽略尾随空格
SQL Server遵循ANSI/ISO SQL-92规范(第8.2节,一般规则#3)中关于如何比较字符串和空格的规定。ANSI标准要求对比较中使用的字符串进行填充,以便它们的长度在比较之前匹配。填充直接影响WHERE和HAVING子句谓词以及其他Transact-SQL字符串比较的语义。例如,Transact-SQL认为字符串“abc”和“abc”对于大多数比较操作是等效的
此规则的唯一例外是LIKE谓词。如果LIKE谓词表达式的右侧具有一个尾随空格的值,则SQL Server不会在进行比较之前将这两个值填充到相同的长度。根据定义,LIKE谓词的目的是方便模式搜索,而不是简单的字符串相等性测试,因此这并不违反前面提到的ANSI SQL-92规范的部分
试试看
select Replace('"' + ZoneReference + '"'," ", "") as QuotedZoneReference from Zone where ZoneReference = 'WF11XU'
是的,马克是对的。运行以下SQL语句:
create table #temp (name varchar(15))
insert into #temp values ('james ')
select '"' + name + '"' from #temp where name ='james'
select '"' + name + '"' from #temp where name like 'james'
drop table #temp
但是,在上面的示例中,关于“like”语句的断言似乎不起作用。输出:
(1 row(s) affected)
-----------------
"james "
(1 row(s) affected)
-----------------
"james "
(1 row(s) affected)
编辑:
要使其发挥作用,您可以在末尾添加:
and name <> rtrim(ltrim(name))
尾随空格并不总是被忽略。 我今天遇到了这个问题。我的表有NCHAR列,并且正在连接到VARCHAR数据。 因为表中的数据没有字段宽,所以SQL Server会自动添加尾随空格 我有一个采用varchar参数的ITVF(内联表值函数)。 这些参数用于与NCHAR字段的表的联接 联接失败,因为传递给函数的数据没有尾随空格,但表中的数据有尾随空格。为什么会这样 我在数据类型优先级上被绊倒了。(见附件) 比较不同类型的字符串时,在比较之前,低优先级类型将转换为高优先级类型。因此,我的VARCHAR参数被转换为NCHARs。对NCHARs进行了比较,很明显,间距是显著的 我是怎么修好的?我更改了函数定义以使用NVARCHAR参数,它们的优先级高于NCHAR。现在,SQL Server自动将NCHARs更改为NVARCHARs,并忽略了尾随空格 为什么我不直接做RTRIM?测试表明,RTRIM降低了性能,阻止了SQL Server本来会使用的连接优化
为什么不更改表的数据类型?这些表已经安装在客户站点上,他们不希望运行维护脚本(支付DBA的时间+金钱)或让我们访问他们的机器(可以理解) 你有点没抓住要点。关键是我没想到,
where
子句与这个记录匹配。是的,我想Neil知道怎么做,他只是想知道为什么他会看到观察到的行为。恐怕我投了反对票,因为这篇文章没有帮助,我相信WHERE ZoneReference='WF11XU'和DATALENGTH(ZoneReference)=DATALENGTH('WF11XU')
也会起作用,可能会比比如@MarkByers更快。是的,我明白了-我试过WHERE'WF11XU'比如ZoneReference
,而且效果不错!越来越奇怪。不过,每天都是上学的日子!
select '"' + name + '"' from #temp where 'james' like name