Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.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
C# SQL WHERE子句使用尾随空格匹配值_C#_Sql_Sql Server_Database_Sql Server 2008 - Fatal编程技术网

C# SQL WHERE子句使用尾随空格匹配值

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

在SQL Server 2008中,我有一个名为
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